'if -e'和'if -f'之间的区别

84

检查文件条件的if语句有两个开关:-e-f

这两者之间有什么区别?


@jww 这是关于Bash脚本中if块的问题 - 它可能不是一种编程语言,但我肯定不会认为这是离题的。 - Ahatius
好的,你已经将它标记为这样了;所以你将它从“我该如何使用这个命令”转移到了编程方面。撤回。 - jww
4个回答

117

参见:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

我认为这些不是“if开关”,而是“test开关”(因为你必须在[]括号内使用它们)。

但区别在于:

[ -e 文件 ] 如果文件存在,则为真。

这将对/etc/hosts/dev/null及目录返回true

[ -f 文件 ] 如果文件存在且是普通文件,则为真。

对于/etc/hosts,这将返回true,对于/dev/null(因为它不是普通文件)和/dev都会返回false,因为它是一个目录。


3
目录是文件系统中除了常规文件以外最常见的东西。 - Keith Thompson
1
这只是我的个人意见,-e选项将会输出符号链接的真实状态,当你想要验证一个文件是否存在时,无论它是目录、符号链接还是普通文件,这都非常有用。 - Julien B.

56
$ man bash

       -e file
              True if file exists.
       -f file
              True if file exists and is a regular file.

常规文件是指不是目录、符号链接、套接字、设备等的文件。


谢谢你的回答。我猜这意味着要使“-f”为真,你必须引用一个不是链接或类似的文件? - Ahatius
是的。它们通常在ls -l输出的第一个字符中有一个“-”。 - jman
1
@Garrett 对于CentOS 6.9也是一样的。 - sevenOfNine
1
test命令带有“-f”选项返回符号链接的原因由nos在https://stackoverflow.com/questions/49380068/what-is-the-regular-file-on-centos-and-ubuntu中回答。 - sevenOfNine

7

if语句实际上使用程序“test”进行测试。你可以有两种方式编写if语句:

if [ -e filename ];

或者

if test -e filename;

如果你知道这个,你可以轻松地查看“test”命令的man页面,以了解不同测试的含义:

man test

6

-e 会检查 任何 类型的文件系统对象;-f 只会检查普通文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接