守听 发表于 2025-2-18 16:35:33

Bash中; && ||命令毗连符不是逻辑毗连符、多个命令的执行顺序

Bash中; && ||命令毗连符不是逻辑毗连符、多个命令的执行顺序

在Shell的Bash语言中,; && ||三个符号用于分隔命令,根据前一个命令的执行状态,按顺序执行背面的命令。它们形似逻辑运算符,但其实不是逻辑运算符,而是命令毗连符。
基础知识


[*]【重要】每个命令执行后都有历程退出状态码,下面简称退出状态码(Exit Status)。为0则表示命令成功执行。非0则表示命令执行失败。具体是多少,由该命令对退出状态码指定。
[*]echo命令没有特殊环境,退出状态码通常是0(由于几乎总是成功执行)。
[*];(分号)用于分隔多个命令,按顺序执行这些命令,无论前一个命令执行成功与否。如在命令行中敲入echo "Hello"; echo "World",按下回车,会输出Hello,同时换行输出World。
[*]&&(AND毗连符)分隔多个命令,只有前一个命令退出状态码为零(即执行成功),就会执行下一条命令。
[*]||(OR毗连符)分隔多个命令,只有前一个命令退出状态码非零(即执行失败),才会执行下一条命令。
[*]注意:&&和||作用的范围是下一条命令,不是整行命令;如果有一行命令序列中有多条命令,如果下一条命令不能执行,不代表下下条命令不能执行。
[*]如果退出状态码非零(即执行失败),在命令行中会打印错误信息,但并不意味着整行命令停止运行。
没有优先级


[*]在Bash语言中,作为命令毗连符,; && ||并没有优先级。
[*]具体到执行上,如果没有括号,永久是从左往右执行。
[*]但是&& ||在退出状态码上,&&与||有逻辑毗连符的特征:A&&B时,只有A和B退出状态码都为0,整体的退出状态码才是0。A||B时,如果A和B的退出状态码有一个是0,整体的退出状态码就是0。
[*]学过Java的同学会有认识:(2>5 && 1235时,就可以忽略背面两条直接判定false了;在shell命令中,(A&&B&&C)也一样,只要A出错了,整体的退出状态码就是非0。(也可类比(A||B||C))
命令序列的执行顺序

在判断某一行由许多命令由命令毗连符构成的命令序列的执行顺序时,我们必要如下操作:(请结合例子动笔写下关键的推理过程)

[*]有括号优先处理括号。
[*]然后从左往右看,每次执行命令后,留意退出状态码与接下类的命令毗连符。
[*]满足以下条件之一的,继承执行下面的命令,返回第2条:

[*]命令毗连符是;
[*]命令毗连符是&&且退出状态码为0
[*]命令毗连符是||且退出状态码为非0
满足以下条件之一的,执行第4条:

[*]命令毗连符是&&且退出状态码为非0
[*]命令毗连符是||且退出状态码为0

[*]将命令毗连符连起来的两条命令外围扩上一层小括号,例如(A ; B)/(A && B)/(A || B),判断小括号内的退出状态码:

[*]如果最终B不执行,返回A的退出状态码
[*]如果最终B执行了,返回B的退出状态码
[*]说人话:B不执行,只要A失败了,整条命令就失败了;B执行了,管他A怎么鸟样,只要B失败了,整条命令就失败了。别的环境整条命令都是成功的。

[*]然后返回第2条,直到全部的命令都执行完毕。
例如:下面的例子中,很多人会误以为不会输出任何东西,但实际上会输出bb。
true || echo aa && echo bb分析:

[*]true不会执行任何操作,返回退出状态码0。后方命令毗连符是||,所以echo aa不会执行。
[*]然后分析(true || echo aa)&& echo bb,由于echo aa不执行,所以返回true这条命令的退出状态码。由于退出状态码为0,所以(true || echo aa)整条命令的退出状态码为0。
[*]然后分析&& echo bb,由于&&且退出状态码为0,所以执行echo bb,打印bb,退出状态码照旧0。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Bash中; && ||命令毗连符不是逻辑毗连符、多个命令的执行顺序