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

时间:2018-03-07 10:02:54

标签: linux bash shell ubuntu logical-operators

我不明白为什么这个if声明会出错:

  

使用太多参数

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

     echo "$file"

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

有问题

2 个答案:

答案 0 :(得分:4)

没有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

请注意引用中的多项更改:如果要扩展,通配符不能在引号内,并且文件名通常应在双引号内(尽管[[之后不需要它或case)。

另请注意,对[[的更改不是POSIX sh命令 - 上面的第一个选择特定于Bash / Ksh / other"现代"延长的炮弹。 POSIX [(又名test)没有简单的方法来检查文件是否与任意通配符表达式匹配。不过,Bash也支持if [ condition1 -o condition2 ],但这也不是便携式的,所以在某种程度上是两个世界中最糟糕的。

答案 1 :(得分:1)

  • 您的then条件缺失fi-o
  • ||运算符不存在,但您可以使用=~表示OR。
  • 由于您使用的是Bash,因此可以使用if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then echo "$file" fi 运算符将字符串与正则表达式进行比较。

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

contains