如何使用通配符在if语句中指定存在条件?

时间:2013-04-11 18:56:00

标签: bash if-statement for-loop

我在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个与模式匹配的文件,我怎么需要修改此块才能循环?

2 个答案:

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