我正在使用一个bash脚本,我想执行一个函数打印返回值:
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $res
}
当我执行fun2时,它不会打印“34”。为什么会这样呢?
我正在使用一个bash脚本,我想执行一个函数打印返回值:
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $res
}
当我执行fun2时,它不会打印“34”。为什么会这样呢?
当前回答
作为对其他人优秀文章的补充,这里有一篇文章总结了这些技巧:
设置一个全局变量 设置一个全局变量,将其名称传递给函数 设置返回代码(并使用$?) 'echo'一些数据(并使用MYVAR=$(myfunction)获取它)
从Bash函数返回值
其他回答
$(…)捕获其中包含的命令发送到标准输出的文本。返回不输出到标准输出。$ ?包含最后一个命令的结果代码。
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}
尽管Bash有一个返回语句,但你唯一可以用它指定的是函数自己的退出状态(0到255之间的值,0表示“成功”)。所以返回不是你想要的。
您可能希望将return语句转换为echo语句——这样就可以使用$()花括号捕获函数输出,这似乎正是您想要的。
这里有一个例子:
function fun1(){
echo 34
}
function fun2(){
local res=$(fun1)
echo $res
}
获取返回值的另一种方法(如果您只想返回一个0-255的整数)是$?
function fun1(){
return 34
}
function fun2(){
fun1
local res=$?
echo $res
}
另外,请注意,您可以使用返回值来使用布尔逻辑-如fun1 || fun2将只在fun1返回非0值时运行fun2。默认返回值是函数中执行的最后一条语句的退出值。
如果在定义函数的脚本中运行,我喜欢做以下事情:
POINTER= # Used for function return values
my_function() {
# Do stuff
POINTER="my_function_return"
}
my_other_function() {
# Do stuff
POINTER="my_other_function_return"
}
my_function
RESULT="$POINTER"
my_other_function
RESULT="$POINTER"
我喜欢这样,因为我可以在函数中包含echo语句
my_function() {
echo "-> my_function()"
# Do stuff
POINTER="my_function_return"
echo "<- my_function. $POINTER"
}
另一种实现方法是名称引用(需要Bash 4.3+)。
function example {
local -n VAR=$1
VAR=foo
}
example RESULT
echo $RESULT
return语句设置函数的退出代码,与exit对整个脚本的作用大致相同。
最后一个命令的退出码总是在$?变量。
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $? # <-- Always echos 0 since the 'local' command passes.
res=$(fun1)
echo $? #<-- Outputs 34
}