我正在使用一个bash脚本,我想执行一个函数打印返回值:

function fun1(){
  return 34
}
function fun2(){
  local res=$(fun1)
  echo $res
}

当我执行fun2时,它不会打印“34”。为什么会这样呢?


当前回答

$(…)捕获其中包含的命令发送到标准输出的文本。返回不输出到标准输出。$ ?包含最后一个命令的结果代码。

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}

其他回答

作为对其他人优秀文章的补充,这里有一篇文章总结了这些技巧:

设置一个全局变量 设置一个全局变量,将其名称传递给函数 设置返回代码(并使用$?) 'echo'一些数据(并使用MYVAR=$(myfunction)获取它)

从Bash函数返回值

你可以创建一个函数,用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)多个变量。

我能想到的最简单的方法是在方法体中像这样使用echo

get_greeting() {
  echo "Hello there, $1!"
}

STRING_VAR=$(get_greeting "General Kenobi")
echo $STRING_VAR
# Outputs: Hello there, General Kenobi!

尽管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。默认返回值是函数中执行的最后一条语句的退出值。

$(…)捕获其中包含的命令发送到标准输出的文本。返回不输出到标准输出。$ ?包含最后一个命令的结果代码。

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}