我在Ubuntu框上运行的bash脚本中有以下语句:
for l in foo_????
do
# do something with $l
done
如果没有与模式匹配的文件,则无法正常工作。
我在for循环前加上:
if [ -f foo_??? ]
then
for l in foo_???
如果有0或1个文件与模式匹配,则可以正常工作,但如果有更多信息与line 4: [: foo_123: binary operator expected
如果有> = 1个与模式匹配的文件,我怎么需要修改此块才能循环?
答案 0 :(得分:4)
如果没有与模式匹配的文件且您不希望循环失败,请设置nullglob
指令:
~/foo $ echo *
*
~/foo $ shopt -s nullglob
~/foo $ echo *
~/foo $
您的if
语句失败的原因与您的for
循环失败的原因相同:未扩展的glob仍然存在。如果您需要符合sh
标准的脚本版本,则可以使用if
语句代替nullglob
指令,但您必须对其进行调整:
for file in foo_???; do
if [ -f "$file" ]; then
…
fi
done
答案 1 :(得分:1)
而不是测试你所拥有的模式是否已经正确扩展,而是使用一些结构来确保你只是将现有文件与你的模式相匹配。
e.g。
find . -maxdepth 1 -type f -name "foo_???" | while read file
do
...
done