对文件掩码执行循环的正确方法是什么?bash循环覆盖文件掩码
E.g.如果掩码没有展开到任何文件,则循环不应该运行;否则,它应该运行它扩展到的所有文件。
与幼稚的做法的问题是,如果*
不会扩展到任何东西,那么整个循环将仿佛*
部分是文件名的实际部分(实际上不存在的文件运行一次)。要做到这一点
对文件掩码执行循环的正确方法是什么?bash循环覆盖文件掩码
E.g.如果掩码没有展开到任何文件,则循环不应该运行;否则,它应该运行它扩展到的所有文件。
与幼稚的做法的问题是,如果*
不会扩展到任何东西,那么整个循环将仿佛*
部分是文件名的实际部分(实际上不存在的文件运行一次)。要做到这一点
一种方法是:
for f in abc*; do if [[ -f "$f" ]]; then
# Do something with "$f"
fi; done
这也将筛选出的目录列表中,这可能会或可能不是你想要的是。
如果要保留目录,请使用-e
而不是-f
。
另一种方法是设置shell选项nullglob
(可能不适用于所有bash版本)。使用nullglob
集合时,与任何文件名不匹配的模式都不会产生任何改变。
shopt -s nullglob
for f in abc*; do
# do something with $f
done
shopt -u nullglob
(这使得nullglob
设置为for
循环的持续时间,你可以取消它的循环,而不是等待结束,在每个循环执行shopt -u
的短小的成本里面。)
使用nullglob
外壳选项,以使通配符不匹配任何扩展到什么,而不是返回通配符本身:
shopt -s nullglob
for file in abc*
do
...
done
_file MASK_?你的意思是通配符模式吗? – Barmar 2014-09-25 06:14:44