Shell 函数
函数把重复使用的逻辑打包命名,需要时直接调用。脚本变长后用函数组织代码,结构清晰、便于维护,是复用代码的基本手段。
定义与调用函数
函数名后跟 () 与 { } 组成函数体,function 关键字可省略(function hello { ... } 写法等价);必须先定义再调用,否则报 command not found。
#!/bin/bash
hello() {
echo "Hello, Linux!"
}
hello # 调用函数
# 输出:Hello, Linux!
函数参数
调用时可传参,函数内用 $1、$2… 接收,$# 是参数个数,$@ 是所有参数:
sum() {
echo "参数个数:$#"
echo "第 1 个参数:$1"
echo "全部参数:$@"
}
sum 10 20 30
# 输出:
# 参数个数:3
# 第 1 个参数:10
# 全部参数:10 20 30
return 返回值
return 返回 0~255 的整数状态码,用 $? 获取;需要返回字符串时直接 echo,用 $( ) 捕获:
check_even() {
[ $(( $1 % 2 )) -eq 0 ] && return 0 || return 1
}
check_even 8
echo "退出码:$?"
# 输出:退出码:0
get_name() {
echo "Linux"
}
echo "获取到:$(get_name)"
# 输出:获取到:Linux
局部变量
local 声明的变量只在函数内有效,同名也不会污染全局:
count=100 # 全局变量
add() {
local count=1 # 局部变量
count=$((count + 1))
echo "函数内 count=$count"
}
add
echo "函数外 count=$count"
# 输出:
# 函数内 count=2
# 函数外 count=100
递归示例
函数可以调用自身实现递归,例如计算阶乘:
fact() {
if [ $1 -le 1 ]; then
echo 1
else
local prev=$(fact $(( $1 - 1 )))
echo $(( $1 * prev ))
fi
}
echo "5 的阶乘:$(fact 5)"
# 输出:5 的阶乘:120
小结
Shell 函数用 名字() { ... } 定义、直接写名字调用;$1/$@/$# 传参,$? 拿退出码,echo+$( ) 取字符串结果,local 隔离局部变量。善用函数,脚本就能从小到大组织起来。