以下只在BASH下测试
在shell中定义函数的方法为
function func_name()
{
函数体
[return]
}
函数体部分可以是任意的Shell命令,也可以调用其他的函数。
return后可跟数值0-255作为函数的返回值;如果不加,将以最后一条命令运行结果作为返回值。返回值将保存到变量"$?"中。
如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。
可以使用break语句来中断函数的执行。
declare –f 可以显示定义的函数清单
declare –F可以只显示定义的函数名
unset –f 可以从Shell内存中删除函数
export –f将函数输出给Shell
如果函数定义在别的文件中,可以通过source或.命令引入。
函数的调用及返回值
函数定义好后就可以跟SHELL中其它命令一样使用,如”func_name 参数1参数2 ...”
下面列子能很好的说明函数的返回值:
1 #! /bin/bash
2
3 fSum 3 2
4 function fSum()
5 {
6 echo $1,$2;
7 return $(($1+$2));
8 }
9
10 fSum 5 7
11 echo $?
12
13 total=$(fSum 3 2)
14 echo total is \"$total\", return value is \"$?\"
输出结果
./test.sh: line 3: fSum: command not found
5,7
12
total is "3,2", return value is "5"
1). 当在第3行执行fSum时函数fSum还没有定义,所以SHELL报错”command not found”
2). 第10行再次执行fSum时,函数体中的echo显示了传入的参数5和7,函数的返回值为12
3). 通过 total=$(fSum 3 2); 这种调用方法,函数的返回值在$?中,而直接通过=获得是函数中echo的输出。
其实通过$(func_name)的方式调用函数时,SHELL为此函数创建一个新的子SHELL。=会把子SHELL的标准左边的变量,函数的返回值仍在变量$?中。
我们可以很容易的通过下面的例子来证实:
#! /bin/bash
function test()
{
echo "i'm stdout"
echo "i'm stderr" >&2
return 10
}
echo "step 1"
test
echo $?
echo "step 2"
$(test)
echo $?
echo "step 3"
val=$(test)
echo \"$val\", return val \"$?\"
结果输出为
step 1
i'm stdout
i'm stderr
10
step 2
i'm stderr
./t.sh: line 15: i'm: command not found
127
step 3
i'm stderr
"i'm stdout", return val "10"
1). 以test方式调用函数,其使用的是于调用者一样的标准输出和标准错误。
2). 以$(test)方式调用函数,当前SHELL会先为函数调用创建一个子SHELL。子SHELL的标准错误与当前SHELL一样,标准输出会在函数结束后返回给当前SHELL。这里被当前SHELL当作命令来执行了,所以出现” i'm: command not found”的错误提示。如果把test函数中的” echo "i'm stdout"”改成” echo "pwd"”,刚才出现的错误会变成显示当前目录。
3). 以val=$(test)方式调用函数,当前SHELL会先为函数调用创建一个子SHELL。子SHELL的标准错误与当前SHELL一样,标准输出会在函数结束后返回给当前SHELL,然后被赋值给val。
Linux shell中的函数调用实践
最新推荐文章于 2024-08-02 17:24:01 发布