bash
中的函数类似于C/C++
中的函数,但return
的返回值与C/C++
不同,返回的是exit code
,取值为0-255
,0
表示正常结束。
如果想获取函数的输出结果,可以通过echo
输出到stdout
中,然后通过$(function_name)
来获取stdout
中的结果。函数的return
值可以通过$?
来获取。
1. 命令格式
不写return
时,默认return 0
。
[function] func_name() {
# function关键字可以省略
语句1
语句2
...
}
2. 不获取return值和stdout值
func() {
name=Tom
echo "Hello $name"
}
func
#输出 Hello Tom
3. 获取return值和stdout值
#! /bin/bash
func() {
name=Tom
echo "Hello $name"
echo "第二行输出"
return 123
}
output=$(func)
tmp=$(func)
ret=$?
echo "output = $output"
echo "return = $ret"
输出
output = Hello Tom
第二行输出
return = 123
4. 函数的输入参数
在函数内,$1
表示第一个输入参数,$2
表示第二个输入参数,依此类推。
**注意:**函数内的$0
仍然是文件名,而不是函数名。
func() {
# 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0
word=""
while [ "${word}" != 'y' ] && [ "${word}" != 'n' ]
do
read -p "要进入func($1)函数吗?请输入y/n:" word
done
if [ "$word" == 'n' ]
then
echo 0
return 0
fi
if [ $1 -le 0 ]
then
echo 0
return 0
fi
sum=$(func $(expr $1 - 1))
echo $(expr $sum + $1)
}
echo $(func 10)
输出:55
5. 函数内的局部变量
可以在函数内定义局部变量,作用范围仅在当前函数内。可以在递归函数中定义局部变量。
local 变量名=变量值
示例
#! /bin/bash
func() {
local name=Tom
echo $name
}
func
echo $name
输出
Tom # 函数内echo输出 Tom
# 函数外name未定义,输出空行