【问题标题】:How does AND and OR operators work in Bash?AND 和 OR 运算符在 Bash 中如何工作?
【发布时间】:2021-07-04 12:41:35
【问题描述】:

我在 bash 上尝试了以下命令

echo this || echo that && echo other

这给出了输出

this
other

我不明白!

我的试跑是这样进行的:

  1. echo this || echo that && echo other 暗示 true || true && true
  2. 由于&&more precedence 具有||,因此第二个表达式首先计算
  3. 由于both are true|| 的评估结果也为真。
  4. 因此,我得出的结论是:

那个

其他

这个

来自&& 的优先级高于|| 的 Java 背景,我无法将其与 bash 联系起来。

任何输入都会非常有帮助!

【问题讨论】:

  • 注意从左到右关联的优先级相同

标签: bash shell


【解决方案1】:

来自man bash

3.2.3 命令列表

列表是一个或多个管道的序列,由运算符“;”、“&”、“&&”或“||”之一分隔,并可选地由“;”、“&”之一终止, 或换行符。

在这些列表运算符中,‘&&’和‘||’具有相同的优先级,其次是‘;’和‘&’,它们具有相同的优先级。

所以,你的例子

echo this || echo that && echo other

可以这样读

(this || that) && other

【讨论】:

    【解决方案2】:

    在 bash 中,&&|| 具有 相等 优先级并关联到左侧。见Section 3.2.3 in the manual for details

    所以,你的例子被解析为

    $ (echo this || echo that) && echo other
    

    因此只有 or 的左侧运行,因为成功了右侧不需要运行。

    【讨论】:

      【解决方案3】:

      bash 中的布尔计算是短路的:true || false 永远不会计算 false 操作数,因为 true 操作数足以确定操作的结果。同样,false && true 不会计算 true 操作数,因为它无法更改表达式的值。

      bash 中的布尔求值实际上主要用于控制操作数的条件求值,而不是它们的顺序。典型用法是do_foo || do_bar_if_foo_failsdo_foo && do_bar_only_if_foo_has_succeeded

      在任何情况下都不会执行您的echo that 命令,因为echo thistrue 并确定整个echo this || echo that 子表达式的值。

      【讨论】:

        【解决方案4】:

        来自man bash

        在这些列表运算符中,&& 和 ||具有相同的优先级,其次是 ;和 &,它们具有相同的优先级。

        所以你的输出是预期的。

        【讨论】:

          【解决方案5】:

          我想你已经明白了。运算符优先级在bash 中不起作用。在您的示例中,一切都从左到右。

          【讨论】:

            【解决方案6】:

            让我们解释一下这是做什么的:

            echo this || echo that && echo other
            

            echo this || echo that -> echo that 仅当 echo this 失败时。

            && echo other -> echo other 仅当&& 之前的命令成功。

            所以基本上:

            echo this---> 成功 ----> echo that ----> 未执行,因为 echo this 成功 ---> echo other ---> 已执行,原因是 echo this || echo that 已执行正确执行。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-26
              相关资源
              最近更新 更多