函数

Bash函数格式

demoFun(){
    echo "This is my first function"
}

echo "-----Execution------"
demoFun
echo "------Finished-----"
#!/bin/bash

funWithReturn(){
    echo "This function will add the two numbers of the input..."
    echo "Enter the first number: "
    read aNum
    echo "Enter the second number: "
    read anotherNum
    echo "The two numbers are $aNum and $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "The sum of the two numbers entered is $? !"
  • 函数返回值在调用该函数后通过 $? 来获得
  • 所有函数在使用前必须定义。

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数… 带参数的函数示例:

#!/bin/bash

funWithParam(){
    echo "The first parameter is $1 !"
    echo "The second parameter is $2 !"
    echo "The tenth parameter is $10 !"
    echo "The tenth parameter is ${10} !"
    echo "The eleventh parameter is ${11} !"
    echo "The total number of parameters is $# !"
    echo "Outputs all parameters as a string $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

The first parameter is 1 !
The second parameter is 2 !
The tenth parameter is 10 !
The tenth parameter is 34 !
The eleventh parameter is 73 !
The total number of parameters is 11 !
Outputs all parameters as a string 1 2 3 4 5 6 7 8 9 34 73 !

函数的返回code

显示返回:return <RETURN_CODE>

隐式返回:如果不指定,则默认以函数体最后一行的执行结果作为返回

返回的code在1-255之间。

其中0=success。

可以使用$?来获取函数执行的结果来进行判断。($?获取上一行命令的返回值), 例如:

[@bogon:myBlog2]$ man cp
[@bogon:myBlog2]$ echo "$?"
0
[@bogon:myBlog2]$ cat /host/sd
cat: /host/sd: No such file or directory
[@bogon:myBlog2]$ echo "$?"
1

示例

功能:传入要备份的文件路径,将文件备份到/tmp目录下

#!/usr/bin/env bash

backup_file() {
    if [[ -f $1 ]] # 检测$1是不是已存在的文件
    then
        # basename 将前面的路径都剔除,只保留文件名
        # $$表示pid(正在运行当前脚本的进程id)。在这里使用这个,为了防止同一天多次备份时,前面的备份被覆盖。
        # $(date +%F) 将日期转化为2019-06-01形式
        local BACK="/tmp/$(basename ${1})-$(date +%F)-$$"
        echo ${BACK}
        cp $1 ${BACK}
    else
        # 此时文件不存在或者cp出了问题,返回码为1
        return 1
    fi
}

backup_file /etc/hosts

# $?表示获取上面函数的返回值。
if [[ $? -eq 0 ]] # 如果为0表示执行成功。
then
    echo "Backup succeeded"
else
    echo "Backup failed!"
    exit 1
fi