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

时间:2012-06-29 19:05:47

标签: bash if-statement syntax

我想重新创建像这样的东西

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

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

line 11: [.: command not found

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

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

3 个答案:

答案 0 :(得分:18)

对于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

答案 1 :(得分:4)

Charles' answer是正确的,因为它向您展示了如何对if语句内的命令进行逻辑运算(并且没有),但它看起来更像是您想要使用{{ 1}}这里:

case

答案 2 :(得分:2)

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

  • [[ ]]用于字符串,(( ))用于整数逻辑
  • &&||运算符可在[[ ]](( ))内部使用,而()可用于分组
  • 无需引用[[ ]](( ))内部的变量扩展名-Bash在这些情况下不会进行单词拆分或globing
  • (( ))内,不需要在变量名后使用$进行扩展
  • [[ ]](( ))可以跨越多行,而无需使用\继续行

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

示例

带整数的复合语句

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

相关