#Bash 的函数
函数(Function)是可以重复调用的代码片段,在 Bash 中定义和调用函数的语法如下:
# 定义函数
function 函数名()
{
    命令
    命令
    ...
}
# 调用函数
函数名 参数1 参数2 ...
- function可以省略
- 在函数内部(下同),使用 $#获取参数个数
- 使用 #@获取全部参数
- 使用 $1获取参数1、$2获取参数2,以此类推- 如果参数大于 9 个,则第 10 个参数以 ${10}的形式读取参数,以此类推
 
- 如果参数大于 9 个,则第 10 个参数以 
示例:
# 定义函数
function greet()
{
    echo "你好 $1"
}
# 调用函数
greet 史蒂夫
运行结果:
你好 史蒂夫
#删除函数
可以使用 unset 命令删除函数:
unset -f 函数名
例如:
unset -f greet
#return 命令
使用 return 命令可以使函数不再继续执行,提前返回。
示例:
# 定义函数
function eat()
{
    if [ "$1" = "青椒" ]; then
        echo "不吃 $1"
        return 1        # 返回
    fi
    echo "吃 $1"
}
# 调用函数
eat 牛肉
eat 青椒
eat 橘子
运行结果:
吃 牛肉 不吃 青椒 吃 橘子
#局部变量
在 Bash 中直接定义的变量属于全局变量,即使在函数内部;定义局部变量需要使用 local 命令。
示例:
# 定义函数
function greet()
{
    NAME="$1"           # NAME 是全局变量
    echo "你好 $NAME"
}
# 调用函数
greet 史蒂夫
# 查看变量
echo NAME:$NAME         # NAME 是全局变量,仍有效
# 定义函数
function eat()
{
    local FOOD="$1"     # FOOD 是局部变量
    echo "吃 $FOOD"
}
# 调用函数
eat 菠萝
# 查看变量
echo FOOD:$FOOD         # FOOD 是局部变量,已失效
运行结果:
你好 史蒂夫 NAME:史蒂夫 吃 菠萝 FOOD:
- 在执行完 greet函数后,全局变量NAME仍然有效
- 在执行完 eat函数后,局部变量FOOD已经失效