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

2 linux bash shell ubuntu logical-operators

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

使用太多参数

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

     echo "$file"
Run Code Online (Sandbox Code Playgroud)

我确实使用了括号的每一个组合,认为可能会有错误,但没有任何改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,则条件有效。所以我认为使用或括号有问题-o......

tri*_*eee 5

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

if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then
   echo "$file"
fi
Run Code Online (Sandbox Code Playgroud)

这当然写得更加简洁和便携

case $file in 'Metro'[0-9]* | 'Store'[0-9]*) echo "$file";; esac
Run Code Online (Sandbox Code Playgroud)

[[请注意引用中的多个更改:如果您希望展开通配符,则通配符不得位于引号内,并且文件名通常应位于双引号内(尽管在or之后不需要case)。

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