我正在使用一个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”。为什么会这样呢?
当前回答
如果在定义函数的脚本中运行,我喜欢做以下事情:
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"
}
其他回答
$(…)捕获其中包含的命令发送到标准输出的文本。返回不输出到标准输出。$ ?包含最后一个命令的结果代码。
fun1 (){
return 34
}
fun2 (){
fun1
local res=$?
echo $res
}
另一种实现方法是名称引用(需要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。默认返回值是函数中执行的最后一条语句的退出值。
我能想到的最简单的方法是在方法体中像这样使用echo
get_greeting() {
echo "Hello there, $1!"
}
STRING_VAR=$(get_greeting "General Kenobi")
echo $STRING_VAR
# Outputs: Hello there, General Kenobi!
你可以创建一个函数,用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)多个变量。