复合在Bash中具有多个表达式的if语句

问题描述 投票:13回答:3

我想重新创建这样的东西

if ( arg1 || arg2 || arg 3) {}

我到目前为止,但我收到以下错误

line 11: [.: command not found

if [ $char == $';' -o $char == $'\\' -o $char == $'\'' ]
then ...

我尝试了不同的方法,但似乎没有工作some of the ones I tried

bash if-statement syntax
3个回答
19
投票

对于bash,你可以使用[[ ]]形式而不是[ ],它允许&&||内部:

if [[ foo || bar || baz ]] ; then
  ...
fi

否则,您可以在外部使用常用的布尔逻辑运算符:

[ foo ] || [ bar ] || [ baz ]

...或使用特定于test命令的运算符(though modern versions of the POSIX specification describe this XSI extension as deprecated -- see the APPLICATION USAGE section):

[ foo -o bar -o baz ]

...这是以下不同的书面形式,同样弃用:

test foo -o bar -o baz

4
投票

Charles' answer是正确的,因为它向你展示了如何对if语句中的命令进行逻辑运算(并且没有,就此而言),但它看起来更像是你想在这里使用case

case $char in
    \;|\\|\') echo found;;
    *) echo 'not found';;
esac

3
投票

Bash的[[ ]](( ))[ ]更强大,更灵活。

  • [[ ]]用于字符串,(( ))用于整数逻辑和算术
  • &&||运算符可以在[[ ]](( ))中使用,()可以用于分组
  • 无需在[[ ]](( ))中引用变量扩展 - Bash在这些上下文中不进行单词拆分或通配
  • (( ))内部,不需要变量名后面的$来扩展它们
  • [[ ]](( ))可以跨越多条线,而不需要继续使用\

使用这些,我们可以编写干净,可读和更可靠的代码。

Examples

带整数的复合语句

a=1 b=2 c=3
((a == 2 || (b == 2 && c == 3))) && echo yes                   # yields yes

带字符串的复合语句

x=apple y=mango z=pear
[[ $x == orange || ($y == mango && $z == pear) ]] && echo yes  # yields yes

[ equivalents for the above statements, using {}

[ "$a" -eq 2 ] || { [ "$b" -eq 2 ] && [ "$c" -eq 3 ]; }
[ "$x" == orange ] || { [ $y == mango ] && [ "$z" == pear ]; }

Related

© www.soinside.com 2019 - 2024. All rights reserved.