&&
是前边成功的话执行后边的语句,||
是前边失败的话执行后边的语句。
这个我是知道的,但为什么会出现下边的问题?
echo aa || echo bb && echo cc
# 想象中的输出,后边的全不执行
>>> aa
# 实际输出
>>> aa
>>> cc
补充一下,比起怎么解决,我更关心到底是怎样的执行过程,求“渔”而非求“鱼”,谢谢大家。
&&
是前边成功的话执行后边的语句,||
是前边失败的话执行后边的语句。
这个我是知道的,但为什么会出现下边的问题?
echo aa || echo bb && echo cc
# 想象中的输出,后边的全不执行
>>> aa
# 实际输出
>>> aa
>>> cc
补充一下,比起怎么解决,我更关心到底是怎样的执行过程,求“渔”而非求“鱼”,谢谢大家。
( echo aa || echo bb ) && echo cc
在shell中,&& 和 || 运算符都具有从左到右的结合性并且优先级相同。
上图的代码echo aa || echo bb && echo cc
实际上等价于(echo aa || echo bb) && echo cc
。
而要达到你所预期的效果,应该写为echo aa || (echo bb && echo cc)
。
可以参考下Linux shell 算数运算符。
对于命令
echo aa || echo bb && echo cc
中||
和&&
来讲,它们只关心处于逻辑前导命令的返回值,也就是说:而对于
cmd1 && cmd2
和cmd1 || cmd2
这样的命令来说,它们的返回值是最后一个被执行的命令的返回值,那就意味着本题中echo aa || echo bb
的返回值即echo aa
的返回值也就是0,所以说echo cc
也会被执行。