在Bash中函数不支持像其他编程语言那样返回值。相反,函数的返回值是其退出状态,这是一个表示成功或失败的数值。零退出状态表示成功,非零退出状态表示失败。
让我们通过例子理解从bash函数返回的值。
虽然存在一个return语句,但它只能用来显式地设置函数的退出状态码。如果在Bash函数中没有指定return语句,那么退出状态码将被设置为函数中最后一个执行命令的状态码。
看下面的例子:
$ cat returnStatus.sh
#!/bin/bash
function test_return_default() {
echo "This should return 0, i.e. the status of echo command"
}
function test_return_explicit_status() {
echo "The function failed during execution!"
return 1
}
test_return_default
echo $?
echo ""
test_return_explicit_status
echo $?
执行脚本后,我们看到以下情况:
单个值可以使用echo命令很容易地从函数返回,该命令将输出定向到标准输出。这个值可以在调用者中赋值给一个变量。
$ cat returnUsingEcho.sh
#!/bin/bash
function func_do_two_plus_three() {
echo "The result is $((2+3))"
}
result=$(func_do_two_plus_three)
echo $result
从函数返回多个值的一种简单方法是在函数中设置全局变量,然后在函数之后引用这些变量。
$cat returnMultUsingGlobVar.sh
#!/bin/bash
function func_do_multiple_math() {
result1=$((2+3))
result2=$((4+7))
}
func_do_multiple_math
echo "The result 1 is $result1"
echo "The result 2 is $result2"
尽管这样可以,但它并不被认为是一种良好的编程实践,尤其是在较大的脚本中。
返回多个值的更好方法是向函数传递参数,并让局部变量存储这些传递参数的名称。
然后,我们可以修改传递的参数以存储函数的结果。
看下面的例子:
$cat returnUsingPassedParams.sh
#!/bin/bash
function func_modify_passed_params() {
local lresult1=$1
local lresult2=$2
eval $lresult1=$((2+3))
eval $lresult2=$((4+7))
}
func_modify_passed_params result1 result2
echo "The result 1 is $result1"
echo "The result 2 is $result2"
执行脚本后:
错误处理是任何编程语言中的一个非常重要的概念。它有助于优雅地处理错误,而不是在运行错误命令时终止程序。
看下面的例子:
$cat errorHandlingInBashFunc.sh
#!/bin/bash
function do_perform_division() {
echo $((numerator/denominator))
}
numerator=5
denominator=0
result=$(do_perform_division numerator denominator)
执行脚本后,
我们可以通过预检查分母并在设置状态码后从函数返回来优雅地处理这个错误。
使用在 $? 变量中返回的状态码,我们可以为用户打印一个有用的信息。
$cat errorHandlingInBashFunc.sh
#!/bin/bash
function do_perform_division() {
if [[ $denominator -eq 0 ]]; then
return 1
fi
echo $((numerator/denominator))
}
numerator=6
denominator=0
result=$(do_perform_division numerator denominator)
if [[ $? -eq 1 ]]; then
echo -e "Denominator should not be 0 for performing division\n"
fi
尽管Bash不支持直接返回值,但是有其他方法可以从函数返回值。