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