【问题标题】:Using compound conditions in a Bash shell script在 Bash shell 脚本中使用复合条件
【发布时间】:2011-01-27 02:52:05
【问题描述】:

我想在 Bash 脚本中执行以下操作。如何在 Bash 语法中实现它?

if !((a==b) && (a==c))
then
    # Do something
end if

【问题讨论】:

    标签: bash shell comparison


    【解决方案1】:

    对于数值比较,你可以这样做:

    if ! (( (a == b) && (a == c) ))
    

    字符串比较:

    if ! [[ "$a" == "$b" && "$a" == "$c" ]]
    

    在 Bash 中,双括号设置了一个算术上下文(顺便说一下,其中美元符号大多是可选的)用于比较(也用于for ((i=0; i<=10; i++))$(()) 算术扩展),并用于区分从一组单括号中创建一个子shell的序列。

    例如,这会执行命令true,并且由于它始终为真,它会执行操作:

    if (true); then echo hi; fi 
    

    这是一样的

    if true; then echo hi; fi
    

    除了创建一个子shell。但是,if ((true)) 会测试名为“true”的变量的值。

    如果您要包含一个美元符号,那么“$true”无疑是一个变量,但带有单括号(或不带括号)的 if 行为会改变。

    if ($true)
    

    if $true
    

    将变量的内容作为命令执行,并根据命令的退出值执行条件操作(如果内容不是有效命令,则给出“未找到命令”消息)。

    if (($true)) 
    

    与上述if ((true)) 做同样的事情。

    【讨论】:

    • 谢谢丹尼斯。这正是我正在寻找的语法类型
    • +1 用于解释双括号!删除我的其他 cmets 进行清理。
    【解决方案2】:
    if [ "$a" != "$b" -o "$a" != "$c" ]; then
      # ...
    else
      # ...
    fi
    

    【讨论】:

    • 或者,直接翻译:if [ ! \\( \\( "$a" = "$b" \\) -a \\( "$a" = "$c" \\) \\) ]...
    • 这样反转运算符的逻辑是De Morgan's law
    • 谢谢威廉泰尔。感谢您简化逻辑检查
    • 感谢 jonathan 和 chrisaycock 的精彩提示 :)
    【解决方案3】:
    #!/bin/bash
    
    a=2
    b=3
    c=4
    
    if ! (( (a == b) && (a == c) )); then
      # stuff here
    fi
    

    您也可以使用我个人认为更清楚的以下内容:

    #!/bin/bash
    
    a=2
    b=3
    c=4
    
    if (( (a != b) || (a != c) )); then
      # stuff here
    fi
    

    从技术上讲,您不需要在子表达式周围加上括号,因为相等运算符 == != 的优先级高于复合比较运算符 && ||,但我认为将它们保留在其中以显示意图,如果没有别的。

    【讨论】:

    • 感谢 SiegeX 的精彩解释!
    猜你喜欢
    • 2018-04-17
    • 2021-12-31
    • 2012-01-28
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2019-02-24
    • 2011-07-19
    相关资源
    最近更新 更多