在 Bash shell if 语句中使用逻辑或

Using logical OR in a Bash shell if statement

我不明白为什么这个 if 语句会给出错误消息:

Using too many arguments

if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]

     echo "$file"

我从字面上使用了括号的每一种组合,认为可能有错误但没有改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就会起作用。所以我假设使用 -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

请注意引号中的多项更改:如果要扩展通配符,则不得将它们放在引号内,并且文件名通常应放在双引号内(尽管在 [[ 或 [=14 之后没有必要) =]).

另请注意对 [[ 的更改,它不是 POSIX sh 命令——上面的第一个选项特定于 Bash / Ksh / other "modern" 扩展 shells。 POSIX [(又名 test)没有简单的方法来检查文件是否与任意通配符表达式匹配。顺便说一下,Bash 也支持 if [ condition1 -o condition2 ] 但那也不是可移植的,所以在某种程度上是两个世界中最糟糕的。

  • 您的 if 条件缺失 thenfi
  • 不存在-o运算符,但可以用||表示OR。
  • 由于您使用的是 Bash,因此您可以使用 =~ 运算符将字符串与正则表达式进行比较。

所以你可以这样写你的条件:

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