在迭代目录中的文件时如下
for f in *.txt; do
...
done
即使没有找到符合指定条件的文件,循环也会执行一次。避免这种错误进入循环的最佳方法是什么?可以将条件作为循环中的第一个语句放置,如果未定义f
则触发循环中断,但也许有更好的解决方案。
答案 0 :(得分:6)
启用nullglob
shell设置:shopt -s nullglob
。
$ for f in *.txt; do
echo "$f"
done
*.txt
$ shopt -s nullglob
$ for f in *.txt; do
echo "$f"
done
来自bah手册页:
了nullglob
If set, bash allows patterns which match no files (see Pathname Expansion above) to expand to a null string, rather than themselves.
答案 1 :(得分:2)
当存在零nullglob
个文件时,您需要启用*.txt
以使glob不显示*.txt
:
shopt -s nullglob
答案 2 :(得分:2)
这是因为,默认情况下,如果没有任何内容与通配符*.txt
匹配,则shell会将其保留为*.txt
而不是null。如果您shopt -s nullglob
,则更改此行为,以便不匹配的通配符将导致null。
所以不是f
在循环中未定义;它在唯一的迭代中被定义为*.txt
。
答案 3 :(得分:2)
另一种方法是使用find
:
find -type f -maxdepth 1 -name '*.txt' | while read f ; do
echo "$f"
done
以下示例甚至可以处理名称中包含换行符的文件(因此应该使用):
find -type f -maxdepth 1 -name '*.txt' -print0 | while read -d $'\0' f ; do
echo "$f"
done