Linux shell脚本中可以通过定义函数的方式对需要重复调用的代码进行定义,这样可以在脚本中只定义一次,但是可以在任何地方多次使用这段代码,也就是通常所说的封装。
函数体执行完成都会生成一个返回值,可以用标准变量$?来确定函数的退出状态码,在shell中函数的返回值通常是函数最后一条命令执行的状态码,所以这里存在一个问题,就是函数体中的其他命令执行的状态码在默认情况下是无法获取的,在这种情况下,无法根据函数的返回值来判断函数调用执行是否成功。
来看下面的例子:
#!/bin/bash
func1() {
echo "尝试显示一个不存在的文件的详细信息"
ls -l noexistfile
echo "这里不会显示前面命令的执行状态码"
}
echo "函数测试:"
func1
echo "退出状态码 : $?"
脚本的执行结果如下:

可以看到虽然函数中执行显示不存在的文件,但是函数最后的退出状态码仍然是0(执行成功,echo语句的执行状态码)
为了避免上述可能存在的问题,可以采用以下方法来处理
1.使用return命令
#!/bin/bash
func1() {
echo "尝试显示一个不存在的文件的详细信息"
ls -l noexistfile
if [ $? -ne 0 ]
then
return 12
fi
echo "这里不会显示前面命令的执行状态码"
}
echo "函数测试:"
func1
echo "退出状态码 : $?"
使用return可以将自定义的返回码赋值给$?标准变量,使用return命令需要注意两点
- 函数一结束就取返回值,$?变量在提取函数返回值之前入过执行了其他命令,return的返回值就会丢失。
- 退出状态码必须是0-255之间的整数
2.使用函数输出
可以对需要获取命令执行结果的语句显式使用echo语句,来自定义返回值,这样就不会被0-255的返回值约束了。
网友评论