我试图在bash脚本中迭代所有zip文件(我使用的是Cygwin,但我有点怀疑这是Cygwin的错误)。
现在看起来像这样:
for z in *.zip
do
echo $z
done
当文件夹中有zip文件时效果很好,它完全回复了zip文件,只有zip文件。但是,当我在一个空的文件夹上执行此操作时,它会回显*.zip
,而当我反而没有回应时。
我该怎么办?我认为正确的解决方案是if [ $z != "*.zip ]
......但是不是吗?
答案 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