从 Bash 函数返回值
与大多数编程语言中的函数不同,Bash 函数不允许您将值返回给调用者。当 bash 函数结束时,它的返回值是它的状态:零表示成功,非零表示失败。 要返回值,您可以设置一个带有结果的全局变量,或使用命令替换,或者您可以传入一个变量名作为结果变量使用。 下面的示例描述了这些不同的机制。
尽管 bash 有一个return语句,但您只能使用它来指定函数的状态,这是一个数值,类似于在exit语句中指定的值。状态值存储在$?变量中。如果一个函数不包含return语句,它的状态是基于函数中执行的最后一个语句的状态设置的。要实际将任意值返回给调用者,您必须使用其他机制。
从 bash 函数返回值最简单的方法就是将全局变量设置为结果。由于 bash 中的所有变量默认都是全局的,因此这很容易
function myfunc()
{
myresult='some value'
}
myfunc
echo $myresult
上面的代码将全局变量myresult设置为函数结果。相当简单,但正如我们都知道的,使用全局变量,尤其是在大型程序中,可能会导致难以找到的错误。
更好的方法是在函数中使用局部变量。 那么问题就变成了如何将结果传递给调用者。 一种机制是使用命令替换
function myfunc()
{
local myresult='some value'
echo "$myresult"
}
result=$(myfunc) # or result=`myfunc`
echo $result
这里,结果输出到 stdout,调用者使用命令替换来捕获变量中的值。 然后可以根据需要使用该变量。
另一种返回值的方法是编写您的函数,使其接受一个变量名作为其命令行的一部分,然后将该变量设置为函数的结果
function myfunc()
{
local __resultvar=$1
local myresult='some value'
eval $__resultvar="'$myresult'"
}
myfunc result
echo $result
由于我们将要设置的变量的名称存储在一个变量中,我们不能直接设置变量,我们必须使用eval来实际进行设置。 该eval语句基本上告诉 bash 解释该行两次,上面的第一个解释会导致字符串result='some value'然后再次解释,最终设置调用者的变量。
当您存储在命令行上传递的变量的名称时,请确保将其存储在一个局部变量中,该变量的名称不会被(不太可能被)调用者使用(这就是我使用__resultvar而不是仅仅resultvar的原因)。 如果你不这样做,并且调用者碰巧为他们的结果变量选择了与你用于存储名称的名称相同的名称,则结果变量将不会被设置。 例如,以下方法不起作用
function myfunc()
{
local result=$1
local myresult='some value'
eval $result="'$myresult'"
}
myfunc result
echo $result
它不起作用的原因是当eval进行第二次解释并评估时result='some value', result现在是函数中的局部变量,因此设置的是它,而不是设置调用者的结果变量。
为了获得更大的灵活性,您可能希望编写您的函数,以便它们结合结果变量和命令替换
function myfunc()
{
local __resultvar=$1
local myresult='some value'
if [[ "$__resultvar" ]]; then
eval $__resultvar="'$myresult'"
else
echo "$myresult"
fi
}
myfunc result
echo $result
result2=$(myfunc)
echo $result2
这里,如果没有将变量名传递给函数,则该值将输出到标准输出。