使用bash的正确方法是if else&& ||捷径?

时间:2013-03-21 03:09:56

标签: bash if-statement

我遇到过一些奇怪的行为(很可能并不奇怪,但我不明白!)

我想使用bash简写语法编写一些if / e,se语句:

[[ 1 -eq 1 ]] && echo "true" || echo "false"

上述代码的输出给出:

true

现在上面的代码实际上工作正常。但是下一个代码不会:

[[ 1 -eq 1 ]] && infMsg "true" || infMsg "false"

infMsg 只是一个功能。上面代码的输出给出:

true
false

我只想说'真'。

&&&&& ||语句处理函数的退出代码?

1 个答案:

答案 0 :(得分:6)

我怀疑'infMsg'的退出代码不是0(成功)。 如果我们分解第一段代码:

[[ 1 -eq 1 ]] && echo "true" || echo "false"

发生的事情是:

  • 首先评估[[ 1 -eq 1 ]] && echo "true"部分代码,因为&&的优先级高于||(更多信息[此处1
  • 前半部分返回true。然后,因为上半部分是真的,后半部分执行echo "true"语句。 (&& - >如果第一部分为真,则运行第二部分)
  • 现在我们有了|| echo "false"。这部分实际上没有执行,因为上半部分(echo "true")返回true,因为echo成功打印((|| - >如果第一部分为假,则运行第二部分)。)。

现在,如果我们分解第二段代码:

[[ 1 -eq 1 ]] && infMsg "true" || infMsg "false"

最有可能发生的事情 是:

    评估
  • [[ 1 -eq 1 ]] && infMsg "true"。第一面是真的。然后,因为上半部分是真的,后半部分执行infMsg "true"语句。 (&& - >如果第一部分为真,则运行第二部分)。
  • 现在我们有|| infMsg "false"。如果上一个命令的infMsg "true"没有返回被解释为success(0)的状态代码,则前半部分被解释为false,触发infMsg "false"(||) - >如果第一部分为假,则运行第二部分。))..

要离开的重要信息:

  • ||如果前半部分为假,则只运行下半部分。
  • &安培;&安培;如果前半部分为TRUE,则仅运行下半部分。