Unix测试存在或文件

时间:2013-01-23 16:07:10

标签: linux bash shell unix

[ -f /tmp/myfile.txt ] && echo "File exists" || echo "No such file"

这是如何工作的?特别是&&||的评估。

2 个答案:

答案 0 :(得分:5)

&&||是控制操作符,用于根据先前命令的退出状态确定是否应执行以下命令。来自man (1) bash

  

控制操作员&&和||分别表示AND列表和OR列表。 AND列表的格式为

  command1 && command2
     当且仅当command1返回退出状态为零时才执行

命令。

     

OR列表的格式为

  command1 || command2
     当且仅当command1返回非零退出状态时才执行

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