当没有文件时,Bash迭代文件会产生奇怪的结果

时间:2015-01-27 02:00:50

标签: bash cygwin

我试图在bash脚本中迭代所有zip文件(我使用的是Cygwin,但我有点怀疑这是Cygwin的错误)。

现在看起来像这样:

for z in *.zip
do
    echo $z
done

当文件夹中有zip文件时效果很好,它完全回复了zip文件,只有zip文件。但是,当我在一个空的文件夹上执行此操作时,它会回显*.zip,而当我反而没有回应时。

我该怎么办?我认为正确的解决方案是if [ $z != "*.zip ] ......但是不是吗?

3 个答案:

答案 0 :(得分:3)

这是预期的行为。来自documentation

  

如果找不到匹配的文件名,并且禁用了shell选项nullglob,则该字保持不变。如果设置了nullglob选项,但未找到匹配项,则会删除该字词。

所以解决方案是在循环之前设置nullglob选项:

shopt -s nullglob
for z in *.zip
    ...

答案 1 :(得分:2)

作为执行命令的步骤之一,shell可以执行路径扩展,在这种情况下,它会将一个字符串(例如*.zip)替换为与该文件匹配的文件列表glob的。 如果没有这样的文件,那么字符串保持不变。合理的解决方案是:

for z in *.zip
do
    [ -f "$z" ] && echo $z
done

[ -f "$z" ]验证文件是否存在并且是常规文件。 &&表示只有在通过该测试时才会执行echo

答案 2 :(得分:1)

或者打开nullglob选项。

$ set -x
$ echo *.none
+ echo '*.none'
*.none
$ shopt -s nullglob
+ shopt -s nullglob
$ echo *.none
$ echo *.none
+ echo