测试文件是否存在,bash脚本

Yot*_*tam 4 bash shell

可能的重复:
检查目录是否包含文件

我想看看目录是否为空,所以我使用[如下:

[ -f "./ini/*"]
Run Code Online (Sandbox Code Playgroud)

即使目录不为空,返回值也始终为 1。任何想法有什么问题吗?

Dav*_* W. 5

尝试这个:

$ echo "*"   #With quotes
Run Code Online (Sandbox Code Playgroud)

$ echo *    #No quotes
Run Code Online (Sandbox Code Playgroud)

看到不同?当您在字符串两边加上引号时,shell 无法通过glob将星号替换为匹配的文件。

有很多种方法可以得到你想要的东西。最简单的是使用ls不带测试命令的命令。该语句获取您给出的命令if的输出结果。它们只是命令的别名。这两个语句是等价的:[...]test

$ if test -f foo.txt

$ if [ -f foo.txt ]
Run Code Online (Sandbox Code Playgroud)

基本上,测试命令所做的就是0如果测试为真则返回 a,如果测试为假则返回非零。if该命令所做的全部工作是if,如果给定的命令返回0退出代码,则执行该语句。我进行这一切的原因是让我们忘记测试并简单地使用命令ls

假设您有一个文件foo.txt,但没有文件bar.txt。请尝试以下操作:

$ ls foo.txt > /dev/null 2>&1
$ echo $?
0
$ ls bar.txt > /dev/null 2>&1
$ echo $?
2
Run Code Online (Sandbox Code Playgroud)

用于> /dev/null 2>&1抑制所有输出。ls请注意,文件存在时命令的退出代码为,文件不存在时命令0的退出代码为 not 。(就是在这种情况下)。现在,让我们使用它来代替测试命令:ls02

if ls ./ini/* > /dev/null 2>&1
then
    echo "There are files in that directory!"
else
    echo "There are no files in that directory"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,我什至不关心测试命令(可以是单词test[..])。

希望这对您有意义。人们有时很难意识到,在 BASH shell 中,if命令 和[...]是两个独立的命令,if所做的只是运行给定的命令,然后根据它运行的命令的退出代码进行操作。