用||回声和&&

时间:2013-02-12 16:11:16

标签: linux bash shell

我在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. 因此,我的结论是:
  5.   

         

    其他

         

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

    任何输入都会非常有用!

6 个答案:

答案 0 :(得分:12)

来自man bash

  

3.2.3命令列表

     

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

     

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

所以,你的例子

echo this || echo that && echo other

可以像

一样阅读
(this || that) && other

答案 1 :(得分:3)

在bash中,&&||具有相等的优先级并且与左侧相关联。请参阅Section 3.2.3 in the manual for details

因此,您的示例被解析为

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

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

答案 2 :(得分:2)

来自man bash

  

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

所以你的输出是预期的。

答案 3 :(得分:2)

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 :(得分:1)

我想你已经明白了。运算符优先级与bash中的运算符优先级不同。在你的例子中,一切都只是从左到右。

答案 5 :(得分:1)

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

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已正确执行。

相关问题