shell 中的 || 命令及 && 到底是怎么执行的?

&&是前边成功的话执行后边的语句,||是前边失败的话执行后边的语句。
这个我是知道的,但为什么会出现下边的问题?

echo aa || echo bb && echo cc
# 想象中的输出,后边的全不执行
>>> aa
# 实际输出
>>> aa
>>> cc

补充一下,比起怎么解决,我更关心到底是怎样的执行过程,求“渔”而非求“鱼”,谢谢大家。

阅读 8.8k
3 个回答

对于命令echo aa || echo bb && echo cc||&&来讲,它们只关心处于逻辑前导命令的返回值,也就是说:

echo bb 是否执行取决于前导命令 echo aa 的返回值
echo cc 是否执行取决于前导命令 echo aa || echo bb 的返回值

而对于 cmd1 && cmd2cmd1 || cmd2这样的命令来说,它们的返回值是最后一个被执行的命令的返回值,那就意味着本题中 echo aa || echo bb 的返回值即echo aa的返回值也就是0,所以说 echo cc 也会被执行。

( echo aa || echo bb ) && echo cc

  1. shell 中 || 和 && 的优先级是一样的
  2. echo aa || echo bb && echo cc 有三个子句组成 (echo aa)和(echo bb)和(echo cc)
  3. (echo aa)返回成功,则后面的子句(echo bb)不会执行
  4. 可以理解为 变成了 echo aa && echo cc
  5. echo aa 成功了,所以会执行 echo cc

http://blog.csdn.net/sinat_30...

在shell中,&& 和 || 运算符都具有从左到右的结合性并且优先级相同。
上图的代码echo aa || echo bb && echo cc实际上等价于(echo aa || echo bb) && echo cc
而要达到你所预期的效果,应该写为echo aa || (echo bb && echo cc)
可以参考下Linux shell 算数运算符

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进