shell AND和OR运算符如何在Bash中工作?

3yhwsihp  于 2023-05-18  发布在  Shell
关注(0)|答案(6)|浏览(421)

我在bash中尝试了以下命令

echo this || echo that && echo other

这给出了输出

this
other

我不明白!
我的预演是这样的:

  1. echo this || echo that && echo other意味着true || true && true
    1.由于&&具有more precedence而不是||,所以第二个表达式首先计算
    1.因为both are true||被评估,也给出真。
    1.因此,我总结输出为:
    那个
    其他
    这个
    由于&&||具有更高的优先级,我无法将其与bash联系起来。
    任何输入都会非常有帮助!
fzsnzjdm

fzsnzjdm1#

man bash
3.2.3命令列表
列表是由操作者之一分隔的一个或多个管线的序列;'、'&'、'&&'或'||’,并且任选地由以下之一终止:'、'&'或换行符。
在这些列表运算符中,'&&'和'||'具有相等的优先级,后跟';'和'&'具有相同的优先级。
那么,你的例子

echo this || echo that && echo other

读起来就像

(this || that) && other
kknvjkwl

kknvjkwl2#

在bash中,&&||具有 * 相等 * 的优先级,并且关联到左边。详见手册第3.2.3节。
因此,您的示例被解析为

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

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

amrnrhlw

amrnrhlw3#

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子表达式的值。

zpf6vheq

zpf6vheq4#

man bash
在这些列表运算符中,&&和||有相同的优先权,其次是;和&,它们具有相同的优先级。
所以你的输出是预期的。

7fhtutme

7fhtutme5#

我觉得你已经想明白了。运算符优先级与bash中的工作方式不同。在您的示例中,所有内容都是从左到右。

uyhoqukh

uyhoqukh6#

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

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

相关问题