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

标签 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: 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/

相关文章:

parsing - Haskell 'else' 解析错误

java - 迭代数组并获取 10 的所有倍数 java

bash脚本: wildcard expression is not processed as expected

python - 在 Python 中启动屏幕并执行 bash 命令

用于重定向流的 Linux 脚本

linux - 如何告诉ffmpeg按顺序遍历目录中的所有文件

linux - 在 bash 中取消失败的反向搜索,但保留我输入的内容

c++ - 在 switch-case 中打开 else 分支可以吗?

检查行时 PHP if 语句 "broken"

python - 需要超过 1 个值才能解压