【问题标题】:Using logical OR in a Bash shell if statement在 Bash shell if 语句中使用逻辑 OR
【发布时间】:2018-03-07 10:02:54
【问题描述】:
我不明白为什么这个if 语句会给出错误提示:
使用太多参数
if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]
echo "$file"
我确实使用了括号的每一种组合,认为可能存在错误,但没有任何改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就会起作用。所以我认为使用-o 或括号有问题...
【问题讨论】:
标签:
linux
bash
shell
ubuntu
logical-operators
【解决方案1】:
没有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 / 其他“现代”扩展 shell。 POSIX [(又名test)没有简单的方法来检查文件是否匹配任意通配符表达式。有趣的是,Bash 也支持if [ condition1 -o condition2 ],但这也不是可移植的,因此在某种程度上是两个世界中最糟糕的。
【解决方案2】:
- 您的
if 条件缺失then 和fi。
-
-o 运算符不存在,但您可以使用|| 来表示 OR。
- 由于您使用的是 Bash,因此您可以使用
=~ 运算符将字符串与正则表达式进行比较。
所以你可以这样写你的条件:
if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
echo "$file"
fi