我在bash中尝试了以下命令
echo this || echo that && echo other
这给出了输出
this
other
我不明白!
我的预演是这样的:
echo this || echo that && echo other
意味着true || true && true
1.由于&&
具有more precedence
而不是||
,所以第二个表达式首先计算
1.因为both are true
,||
被评估,也给出真。
1.因此,我总结输出为:
那个
其他
这个
由于&&
比||
具有更高的优先级,我无法将其与bash联系起来。
任何输入都会非常有帮助!
6条答案
按热度按时间fzsnzjdm1#
从
man bash
3.2.3命令列表
列表是由操作者之一分隔的一个或多个管线的序列;'、'&'、'&&'或'||’,并且任选地由以下之一终止:'、'&'或换行符。
在这些列表运算符中,'&&'和'||'具有相等的优先级,后跟';'和'&'具有相同的优先级。
那么,你的例子
读起来就像
kknvjkwl2#
在bash中,
&&
和||
具有 * 相等 * 的优先级,并且关联到左边。详见手册第3.2.3节。因此,您的示例被解析为
因此,只有或的左侧运行,因为它成功,右侧不需要运行。
amrnrhlw3#
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
子表达式的值。zpf6vheq4#
man bash
:在这些列表运算符中,&&和||有相同的优先权,其次是;和&,它们具有相同的优先级。
所以你的输出是预期的。
7fhtutme5#
我觉得你已经想明白了。运算符优先级与
bash
中的工作方式不同。在您的示例中,所有内容都是从左到右。uyhoqukh6#
让我们来解释一下这是做什么的:
echo this || echo that
->echo that
,仅当echo this
失败时。&& echo other
->echo other
,仅当&&
之前的命令成功时。所以基本上:
echo this
--->成功---->echo that
--->未执行,因为echo this
成功--->echo other
--->执行echo this || echo that
已正确执行。