bash 循环遍历文件掩码

cns*_*nst 2 bash filenames loops for-loop

对文件掩码进行 for 循环的正确方法是什么?

例如,如果掩码未扩展到任何文件,则不应运行循环;否则,它应该运行它扩展到的所有文件。

天真的方法的问题是,如果*不扩展到任何内容,那么整个循环将运行一次,就好像该*部分是文件名(实际上不存在的文件)的实际部分一样。

ric*_*ici 7

一种方法是:

for f in abc*; do if [[ -f "$f" ]]; then
  # Do something with "$f"
fi; done
Run Code Online (Sandbox Code Playgroud)

这也将从列表中过滤出目录,这可能是也可能不是您想要的。

如果您想保留目录,请-e使用-f.

另一种方法是设置 shell 选项nullglob(可能并非在所有 bash 版本上都可用)。设置后,与nullglob任何文件名不匹配的模式将不会产生任何结果,而不是保持不变。

shopt -s nullglob
for f in abc*; do
  # do something with $f
done
shopt -u nullglob
Run Code Online (Sandbox Code Playgroud)

(这会nullglob在循环期间保留设置for。您可以在循环内取消设置它,而不是等待结束,而在shopt -u每个循环上执行的成本很小。)