4

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

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

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

上述代码的输出给出:

true

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

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

infMsg只是一个函数。上述代码的输出给出:

true
false

我只希望它说“真实”。

我在 && || 的方式上有什么遗漏吗?语法处理函数的退出代码?

4

1 回答 1

11

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

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

正在发生的事情是:

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

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

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

有可能发生的是:

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

重要的信息在这里拉开:

  • || 如果前半部分为 FALSE,则仅运行后半部分。
  • && 仅在前半部分为 TRUE 时才运行后半部分。
于 2013-03-21T04:36:35.213 回答