我在 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: binaryoperator Expected
我需要如何修改此 block 以仅在有 >= 1 个文件匹配该模式时才循环?
最佳答案
如果没有与模式匹配的文件并且您不希望循环失败,请设置 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
关于bash - 如何使用通配符在 if 语句中指定存在条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956647/