Bash函数返回值详解
嘻嘻发布于2024-02-22
最后更新于2023年11月20日
浏览在Bash中函数不支持像其他编程语言那样返回值。相反,函数的返回值是其退出状态,这是一个表示成功或失败的数值。零退出状态表示成功,非零退出状态表示失败。
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 $?
执行脚本后,我们看到以下情况:
- 函数 test_return_default 返回 echo语句 的状态,即0。
- 在函数 test_return_explicit_status 中,状态是通过return命令显式返回的。
- 状态码被设置在$?变量中,并可以由调用者访问以做出决策。
使用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"
执行脚本后:
- func_modify_passed_params result1 result2 将参数 result1 和 result2 传递给函数。
- local lresult1=$1 将局部变量 lresult1 设置为等于第一个参数的名称,即 result1。
- eval $lresult1=$((2+3)) 设置由 lresult1 引用的变量,即 result1=5。
错误处理
错误处理是任何编程语言中的一个非常重要的概念。它有助于优雅地处理错误,而不是在运行错误命令时终止程序。
看下面的例子:
$cat errorHandlingInBashFunc.sh
#!/bin/bash
function do_perform_division() {
echo $((numerator/denominator))
}
numerator=5
denominator=0
result=$(do_perform_division numerator denominator)
执行脚本后,
- 它遇到了运行时错误,因为分母=0导致了除以0,这是无效的。
- 脚本立即终止并向用户打印错误。
我们可以通过预检查分母并在设置状态码后从函数返回来优雅地处理这个错误。
使用在 $? 变量中返回的状态码,我们可以为用户打印一个有用的信息。
$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不支持直接返回值,但是有其他方法可以从函数返回值。
- 对于返回单个结果的简单函数,使用echo命令将输出定向到stdout并在调用者中将结果赋值给变量更简单。
- 对于返回2个或更多结果的函数,修改函数中的全局变量是一种可能的解决方案,但这很快就变得难以处理,尤其是在较大的脚本中。
- 在处理多个结果时,传递和修改大函数中的参数是一种更好的方法。
- Bash函数可以返回自定义状态码,这可以用来优雅地处理脚本中的错误并做出处理。