Linux 在Bash shell if语句中使用逻辑OR

Linux 在Bash shell if语句中使用逻辑OR,linux,bash,shell,ubuntu,logical-operators,Linux,Bash,Shell,Ubuntu,Logical Operators,我不明白为什么这个if语句给出了一个错误,它说: 使用太多参数 我确实使用了每一个括号的组合,认为可能有错误,但没有任何改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就可以工作。因此,我假设使用-o或括号有问题…没有shell操作符-o,您似乎正在寻找 if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then echo "$file" fi 当然,它写得更简洁,更便于携带 case $file in '

我不明白为什么这个
if
语句给出了一个错误,它说:

使用太多参数


我确实使用了每一个括号的组合,认为可能有错误,但没有任何改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就可以工作。因此,我假设使用
-o
或括号有问题…

没有shell操作符
-o
,您似乎正在寻找

if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then
   echo "$file"
fi
当然,它写得更简洁,更便于携带

case $file in 'Metro'[0-9]* | 'Store'[0-9]*) echo "$file";; esac
请注意引号中的多个更改:如果要展开通配符,则通配符不能位于引号内,并且文件名通常应位于双引号内(尽管在
[[/code>或
大小写之后不需要)

还请注意对
[[
的更改,它不是POSIX
sh
命令——上面的第一个选项是针对Bash/Ksh/其他“现代”扩展shell的没有简单的方法来检查文件是否匹配任意通配符表达式。指示性地说,Bash还支持
if[condition1-o condition2]
,但这也不可移植,因此在某种程度上是两个世界中最糟糕的一个。

  • 您的
    如果
    条件缺失
    ,则
    fi
  • -o
    运算符不存在,但可以使用
    |
    表示或
  • 因为您使用的是Bash,所以可以使用
    =~
    操作符将字符串与正则表达式进行比较
所以你可以这样写你的条件:

if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
     echo "$file"
fi

您是否遗漏了
then
fi
语句?您能否在此详细说明一下您想要实现的目标?
if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
     echo "$file"
fi