12

我在 bash 上尝试了以下命令

echo this || echo that && echo other

这给出了输出

this
other

我不明白!

我的试运行是这样的:

  1. echo this || echo that && echo other暗示true || true && true
  2. 因为, &&has more precedencethan ||, 第二个表达式首先计算
  3. 因为,both are true||被评估,这也给出了真实的。
  4. 因此,我得出的结论是:

其他

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

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

4

6 回答 6

15

man bash

3.2.3 命令列表

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

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

所以,你的例子

echo this || echo that && echo other

可以读成

(this || that) && other
于 2013-02-12T16:15:28.980 回答
5

在 bash 中,&&具有||相同优先级并关联到左侧。详细信息请参见手册中的第 3.2.3 节

因此,您的示例被解析为

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

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

于 2013-02-12T16:14:47.307 回答
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 thisis trueand 决定了整个echo this || echo that子表达式的值。

于 2013-02-12T16:15:16.293 回答
2

来自man bash

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

所以你的输出是预期的。

于 2013-02-12T16:13:56.020 回答
1

我想你已经想通了。运算符优先级在bash. 在您的示例中,一切都从左到右。

于 2013-02-12T16:14:01.383 回答
1

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

echo this || echo that && echo other

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

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

所以基本上:

echo this---> SUCCESS ----> echo that----> 成功后未执行echo this---> echo other---> 已执行 原因echo this || echo that已正确执行。

于 2013-02-12T16:17:13.747 回答