我在bash上尝试了以下命令
echo this || echo that && echo other
这给出了输出
this
other
我不明白!
我的干跑就是这样:
echo this || echo that && echo other
隐含true || true && true
&&
有more precedence
而不是||
,因此第二个表达式首先评估both are true
,||
的评估也是真实的。这
其他
此
来自&&
优先于||
的Java背景,我无法将其与bash联系起来。
任何输入都会非常有用!
答案 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)
答案 3 :(得分:2)
bash
中的布尔值评估是短路的:true || false
永远不会评估false
操作数,因为true
操作数足以确定操作的结果。同样,false && true
不会评估true
操作数,因为它无法更改表达式的值。
bash
中的布尔值评估实际上主要用 来控制操作数的条件评估,而不是它们的顺序。典型用途为do_foo || do_bar_if_foo_fails
或do_foo && do_bar_only_if_foo_has_succeeded
。
在任何情况下都不会执行echo that
命令,因为echo this
为true
并确定整个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
已正确执行。