bash for循环能够进行零迭代

时间:2014-08-21 19:59:25

标签: bash for-loop

在迭代目录中的文件时如下

for f in *.txt; do
    ...
done

即使没有找到符合指定条件的文件,循环也会执行一次。避免这种错误进入循环的最佳方法是什么?可以将条件作为循环中的第一个语句放置,如果未定义f则触发循环中断,但也许有更好的解决方案。

4 个答案:

答案 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