`for in`命令文件名扩展问题

`for in`命令文件名扩展问题

我有一个bash脚本:-

for i in *.x *.y *.z *.a *.b *.c
do
    echo "$i"
done

如果没有与该模式匹配的文件*.y,则该变量i的值为*.y。当这种情况发生时,我的逻辑就会变得混乱。

我该如何阻止这种情况发生?

答案1

这就是您想要使用nullglob不匹配的全局选项来扩展为空的地方,而不是保持原样

shopt -s nullglob
for i in *.x *.y *.z *.a *.b *.c; do
  ...
done

在这里,你还可以这样做:

shopt -s nullglob
for i in *.[xyzabc]; do
  ...
done

这会更有效,因为只有一个区域需要扩展。但请注意,顺序会有所不同。

或者对于不是单个字符的扩展名:

shopt -s nullglob extglob
for i in *.@(x|y|foo|bar); do
  ...
done

为什么 nullglob 不是默认值?有关此内容的更多信息以及其他 shell 的替代方案。

相关内容