本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。
bash shell 会把函数当作一个小型脚本,运行结束时会返回一个退出状态码。
有 3 种不同的方法来为函数生成退出状态码。
默认退出状态码
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。在函数执行结束后,可以用标准变量 $?
来确定函数的退出状态码。
函数的退出状态码是 1
,这是因为函数中的最后一条命令没有成功运行。但你无法知道函数中其他命令中是否成功运行。看下面的例子。
这次,由于函数最后一条语句 echo
运行成功,该函数的退出状态码就是 0
,尽管其中有一条命令并没有正常运行。使用函数的默认退出状态码是很危险的。幸运的是,有几种办法可以解决这个问题。
使用return命令
bash shell 使用 return
命令来退出函数并返回特定的退出状态码。 return
命令允许指定一个整数值来定义函数的退出状态码,从而提供了一种简单的途径来编程设定函数退出状态码。
dbl
函数会将 $value
变量中用户输入的值翻倍,然后用 return
命令返回结果。脚本用 $?
变量显示了该值。
但当用这种方法从函数中返回值时,要小心了。记住下面两点来避免问题:
- 记住,函数一结束就取返回值;
- 记住,退出状态码必须是
0~255
。
如果在用 $?
变量提取函数返回值之前执行了其他命令,函数的返回值就会丢失。记住, $?
变量会返回执行的最后一条命令的退出状态码。
第二个问题界定了返回值的取值范围。由于退出状态码必须小于 256
,函数的结果必须生成一个小于 256
的整数值。任何大于 256
的值都会产生一个错误值。
要返回较大的整数值或者字符串值的话,你就不能用这种返回值的方法了。
使用函数输出
正如可以将命令的输出保存到 shell 变量中一样,你也可以对函数的输出采用同样的处理办法。可以用这种技术来获得任何类型的函数输出,并将其保存到变量中:
这个命令会将 dbl
函数的输出赋给 $result
变量。下面是在脚本中使用这种方法的例子。
新函数会用 echo
语句来显示计算的结果。该脚本会获取 dbl
函数的输出,而不是查看退出状态码。
这个例子中演示了一个不易察觉的技巧。你会注意到 dbl
函数实际上输出了两条消息。 read
命令输出了一条简短的消息来向用户询问输入值。 bash shell 脚本非常聪明, 并不将其作为 STDOUT 输出的一部分,并且忽略掉它。如果你用 echo
语句生成这条消息来向用户查询,那么它会与输出值一起被读进 shell 变量中。
通过这种方式,你还可以返回浮点值和字符串值。这使它成为一种获取函数返回值的强大方法。
评论区