测试bash函数返回值的正确方法是什么?

gro*_*k12 56 bash function

我想在if语句中测试一个bash函数返回值,如下所示:

if [[ func arg ]] ; then …
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息,如:条件二进制运算符预期.

这样做的正确方法是什么?

是吗:

 if [[ $(func arg) ]] ; then ...
Run Code Online (Sandbox Code Playgroud)

kay*_*kay 70

如果是退出代码而不是结果你可以使用

if func arg; then ...
Run Code Online (Sandbox Code Playgroud)

如果您无法使函数返回正确的退出代码(with return N),并且您必须使用字符串结果,请使用@Alex Gitelman答案.

$ help if:

if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

基于条件执行命令.

if COMMANDS列表已执行.如果其退出状态为零,则 then COMMANDS执行列表.否则,elif COMMANDS依次执行每个列表,如果其退出状态为零,then COMMANDS则执行相应的 列表并完成if命令.否则,执行`else COMMANDS'列表(如果存在).整个构造的退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则为零.

退出状态:返回最后执行的命令的状态.

  • 另见http://mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D (4认同)
  • 如何测试负值? (3认同)
  • 那样太好了!很难相信正确的方法是最简单的!我对unix/shell/bash/futureofhumanity的信心被放大了! (2认同)
  • @kay我没有写否定的东西,我写了否定的。您如何测试负值?`if!func arg; `不起作用。 (2认同)
  • @kay 是的,我突然想到...`if func ; 然后 ; 别的 ...; fi`我希望有更好的东西:)不过还是谢谢。 (2认同)
  • @OndraŽižka 参加聚会有点晚,但您可以使用:`if ! 功能参数; 然后 echo "func 返回非零"; fi` 注意否定运算符和函数调用之间的空间 (2认同)

Ale*_*man 16

如果函数返回多个单词,则似乎会产生此错误.

例如,1 2.

引用它:

"$(func arg)"
Run Code Online (Sandbox Code Playgroud)

样品:

$ if [[ 1 2 ]] ; then echo 1 ; fi
-bash: conditional binary operator expected
-bash: syntax error near `2'
$ if [[ "1 2" ]] ; then echo 1 ; fi
1
Run Code Online (Sandbox Code Playgroud)

如果你比较0和非0只是使用

if [[ "$(func arg)" != "0" ]]
Run Code Online (Sandbox Code Playgroud)

  • 避免使用单括号,例如参见 http://mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D (3认同)

小智 15

这对我很有用,所以我会添加以下细节.

如果需要测试两个条件,一个是函数/命令的退出状态,另一个是变量的值,请使用:

if func arg && [[ $foo -eq 1 ]]; then echo TRUE; else echo FALSE; fi
Run Code Online (Sandbox Code Playgroud)


cod*_*ter 7

相关说明,如果函数返回各种退出代码而不是 true/false,则:

func args; ec=$?      # call function and grab the exit code
                      # it is better to have them on the same line so that a future addition of a command
                      # before the case statement wouldn't break the logic
case $ec in
  value1) # commands
          ;;
  value2) # commands
          ;;
  *)      # commands
          ;;
esac
Run Code Online (Sandbox Code Playgroud)