2

我在 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个文件与模式匹配,我如何需要修改此块以仅循环?

4

2 回答 2

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
于 2013-04-11T18:58:20.577 回答
1

而不是测试您的模式是否已正确扩展,您使用一些结构来确保您只获得与您的模式匹配的现有文件。

例如

 find . -maxdepth 1 -type f -name "foo_???" | while read file
 do
     ...
 done
于 2013-04-11T21:27:10.613 回答