[ -f /tmp/myfile.txt ] && echo "File exists" || echo "No such file"
这是如何工作的?特别是&&
和||
的评估。
答案 0 :(得分:5)
&&
和||
是控制操作符,用于根据先前命令的退出状态确定是否应执行以下命令。来自man (1) bash
:
如果命令通过测试,控制操作员&&和||分别表示AND列表和OR列表。 AND列表的格式为
当且仅当command1返回退出状态为零时才执行command1 && command2
命令。
OR列表的格式为
当且仅当command1返回非零退出状态时才执行command1 || command2
command2。 AND和OR列表的返回状态是最后一个的退出状态 命令在列表中执行。
[
或test
将返回零退出状态。来自help test
:
测试:测试[expr] 退出状态为0(真)或1(假)取决于 对EXPR的评价。
所以当你这样做时
[ -f /tmp/myfile.txt ] && echo foo || echo bar
你真正说的是(请仔细阅读)如果文件存在,请回显foo。如果文件不存在或echo foo
命令失败,则回显栏。
这是这些控制操作符和if…then
命令之间的微妙但重要的区别。
答案 1 :(得分:0)
基本思想是它从左到右运行
首先评估-f /tmp/myfile.txt,如果文件存在并且是文件,则为true
接下来它试图评估&&它采用左右参数。这是一个合乎逻辑的“和”
它从左到右进行延迟评估,因此如果文件测试为真,那么它会检查echo命令是否为true,它通过执行它来执行。在shell世界中可能是“true”意味着它通常使用零退出代码执行
如果文件测试或回声中的任何一个(&&的两个参数)都为假,那么&&的输出。是假的,这是传递到右边的
||是一个逻辑“或”,也有一个左右arg。如果左边的arg是真的那么它就会停止,因为它是懒惰的
如果左arg为假(文件不存在),则运行右手arg