#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
已经失效