我正在使用一个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”。为什么会这样呢?
当前回答
另一种实现方法是名称引用(需要Bash 4.3+)。
function example {
local -n VAR=$1
VAR=foo
}
example RESULT
echo $RESULT
其他回答
你可以创建一个函数,用eval修改输入参数,而不是用整个函数输出调用var=$(func)。
var1="is there"
var2="anybody"
function modify_args() {
echo "Modifying first argument"
eval $1="out"
echo "Modifying second argument"
eval $2="there?"
}
modify_args var1 var2
# Prints "Modifying first argument" and "Modifying second argument"
# Sets var1 = out
# Sets var2 = there?
这可能是有用的情况下,你需要:
打印到函数范围内的stdout/stderr(不返回) 返回(set)多个变量。
另一种实现方法是名称引用(需要Bash 4.3+)。
function example {
local -n VAR=$1
VAR=foo
}
example RESULT
echo $RESULT
尽管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。默认返回值是函数中执行的最后一条语句的退出值。
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
}
$(…)捕获其中包含的命令发送到标准输出的文本。返回不输出到标准输出。$ ?包含最后一个命令的结果代码。
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}