用||回显 和&&

我在bash上尝试了下面的命令

echo this || echo that && echo other 

这给出了输出

 this other 

我不明白!

我的干运行是这样的:

  1. echo this || echo that && echo other echo this || echo that && echo other意味着true || true && true true || true && true
  2. 因为&&||more precedence ,第二个expression式首先评估
  3. 既然both are true|| 评估这也是真实的。
  4. 因此,我得出的结论是:

其他

这个

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

任何投入将是非常有益的!

man bash

3.2.3命令列表

列表是一个或多个由一个操作符';','&','&&'或'||'分隔的流水线的序列,可选地以';','&'或新队。

在这些列表运算符中, “&&”和“||” 具有同等的优先权 ,其次是“;” 和“&”,具有同等优先权。

所以,你的例子

 echo this || echo that && echo other 

可以像读

 (this || that) && other 

man bash

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

所以你的输出是预期的。

在bash中, &&||平等的优先权和左派。 有关详细信息,请参阅手册中的第3.2.3节 。

所以,你的例子被解析为

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

因此只有左侧或者左侧运行,因为右侧的右侧不需要运行。

bash布尔值评估是短路: true || false true || false将永远不会评估false操作数,因为true操作数足以确定操作的结果。 同样, false && true也不会评估true操作数,因为它不能改变表达式的值。

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

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

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

让我们来解释一下:

 echo this || echo that && echo other 

echo this || echo that echo this || echo that – > echo that只有echo this FAILS。

&& echo other – > echo other只有前面命令&&成功。

所以基本上:

echo this —> SUCCESS —-> echo that —->不执行,因为echo this成功—> echo other —>被执行导致echo this || echo that echo this || echo that正确执行。