shell脚本中的-d
,-e
,-f
有什么区别?我想了解-e
,-d
和-f
参数之间的区别。
示例:if [ -d /path ]
,if [ -e /path/ ]
,if [ -f /path ]
据我所知
-d
检查目录是否存在-e
检查目录和内容(如果目录中存在内容,则返回true)-f
检查文件是否存在答案 0 :(得分:5)
有多种不同类型的对象可以存在于文件系统中。常规文件和目录只是其中两个;其他包括管道,套接字和各种设备文件。这是一个使用管道来说明三个选项之间差异的示例。 -e
只检查命名参数是否存在,无论它实际是什么。 -f
和-d
要求其参数既存在又具有适当的类型。
$ mkfifo pipe # Create a pipe
$ mkdir my_dir # Create a directory
$ touch foo.txt # Create a regular file
$ [ -e pipe ]; echo $? # pipe exists
0
$ [ -f pipe ]; echo $? # pipe exists, but is not a regular file
1
$ [ -d pipe ]; echo $? # pipe exists, but is not a directory
1
$ [ -e my_dir ] ; echo $? # my_dir exists
0
$ [ -f my_dir ] ; echo $? # my_dir exists, but is not a regular file
1
$ [ -d my_dir ] ; echo $? # my_dir exists, and it is a directory
0
$ [ -e foo.txt ] ; echo $? # foo.txt exists
0
$ [ -f foo.txt ] ; echo $? # foo.txt exists, and it is a regular file
0
$ [ -d foo.txt ] ; echo $? # foo.txt exists, but it is not a directory
1
你没有问过它,但有一个-p
选项来测试一个对象是否是一个管道。
$ [ -p pipe ]; echo $? # pipe is a pipe
0
$ [ -p my_dir ]; echo $? # my_dir is not a pipe
1
$ [ -p foo.txt ]; echo $? # foo.txt is not a pipe
1
其他类型的条目,以及用于测试它们的命令:
-b
)-c
)-S
)-h
和-L
的工作原理相同;我不记得两者的定义历史。)答案 1 :(得分:0)
所有这些都在" man test"中解释,或者拼写为" man ["。