从 bash 函数返回一个值

use*_*293 11 bash shell-script

如果数字是有效的十位数字,我有一个函数返回 1:

valNum()
{
    flag=1
    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=0
    fi
    return $flag
}
Run Code Online (Sandbox Code Playgroud)

它被称为:

if [[ $(valNum $num) -eq 1 ]]; then
      #do something
fi
Run Code Online (Sandbox Code Playgroud)

如果数字有效,该函数工作正常,但如果输入无效数字,则显示语法错误。

小智 16

@choroba 的回答是正确的,但是这个例子可能更清楚:

valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
  : # do something
fi
Run Code Online (Sandbox Code Playgroud)

这个例子有点长(设置$valNumResult然后查询那个值),但更明确地描述了发生的事情:valNum()返回一个值,并且可以查询和测试该值。

PS 请帮自己一个忙,并0true和非零返回false。这样你就可以在失败的情况下使用返回值来指示“我们失败的原因”。


cho*_*oba 8

bash 中的函数只能返回退出代码。相反,命令替换用于获取命令或函数的标准输出。因此,要检查返回的标志,您不需要替换:

if valNum "$num" ; then
    # ...
fi
Run Code Online (Sandbox Code Playgroud)

但是,要使其正常工作,如果数字有效,则应返回 0,否则应返回 1(退出代码 0 表示没有错误)。

  • 顺便说一句,“高级 Bash 脚本指南”不是一个很好的指南——它在很多方面都是错误的,并且鼓励了一些糟糕的脚本实践。http://mywiki.wooledge.org/BashFAQ 上的 Bash FAQ 是更好的资源。 (2认同)

Gil*_*il' 5

您不能从 shell 函数返回任意结果。您只能返回一个状态代码,它是 0 到 255 之间的整数。(虽然您可以将更大的值传递给return,但它会以256 为模被截断。)该值必须为 0 表示成功,不同的值表示失败;按照惯例,您应该坚持使用 1 到 125 之间的错误代码,因为更高的值具有特殊含义(126 和 127 的外部命令错误,被更高值的信号杀死)。

由于您在此处返回是或否结果,因此状态代码是合适的。由于flag似乎表示成功或失败,您应该使用常规值 0 表示成功,1 表示失败(与您所写的相反)。然后您可以直接在 if 语句中使用您的函数。

valNum ()
{
  local flag=0
  if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
    echo 1>&2 "Invalid Number"
    flag=1
  fi
  return $flag
}
if valNum "$num"; then
  #do something
fi
Run Code Online (Sandbox Code Playgroud)

如果需要区分故障代码,直接调用该函数即可。在它返回后,故障代码立即在$?. 然后,您可以使用 case 语句检查它:

valNum "$num"
case $? in …
Run Code Online (Sandbox Code Playgroud)

如果您稍后需要使用状态代码,请在$?被下一个命令覆盖之前将其保存到另一个变量中。

valNum "$num"
valNum_status=$?
Run Code Online (Sandbox Code Playgroud)

您编写的内容不起作用,因为命令替换$(…)扩展到函数的输出,在您的代码中,它要么是错误消息,要么是空的, never 1

如果您需要传递的信息多于状态码允许的 shell 函数之外的信息,您有两种可能性:

  • 在标准输出上打印一些文本,并在命令替换中调用该函数: $(valNum "$num")
  • 分配给函数内的一个或多个变量,稍后读取这些变量。