使用带有“if-then-else”的命令的布尔表达式

时间:2016-10-21 15:17:45

标签: bash

我们知道可以执行if command ; then something ; fi,其中从command返回的状态被解释为boolean(0 == true)。我们也知道可以做if [[ $a > $b || $c == yes ]] ; then something; fi

但我很好奇,因为我们不允许使用“if”组合布尔表达式等命令,如if cmd1 || cmd2; then ; something; fi中所示。或者我们可以吗?

如果没有“if”甚至嵌套if,还有其他方法可以做到这一点。但是,我对使用if: - )。

感兴趣

感谢任何评论。

2 个答案:

答案 0 :(得分:3)

这是正确的。 if语句的条件被定义为一个列表,粗略地说是单个管道,&&||连接的两个列表。这些不是布尔运算符,尽管有相似之处。 a && b运行a,然后如果 b成功,则运行a a || b运行a,然后如果 b失败则运行a

比较

if [[ $a > $b || $c == yes ]]; then   # conditional operators
if [[ $a > $b ]] || [[ $c == yes ]]; then   # shell operators

鉴于[[ ... ]]是一个内置命令,两者之间的差别很小。但是, shell 运算符具有相同的优先级,而条件运算符&&的优先级高于条件||。那是

if a || b && c; then # same as (a || b) && c
if [[ a || b && c ]]; then # same as a || (b && c)

答案 1 :(得分:0)

我会把它留在这里。

check_and() {
    if grep -q A <<<"$1" && grep -q C <<<"$1"; then
        echo YES
    else
        echo NO
    fi
}

check_or() {
    if grep -q A <<<"$1" || grep -q C <<<"$1"; then
        echo YES
    else
        echo NO
    fi
}

check_and ABC # YES
check_and ABD # NO
check_and ZBC # NO
check_and ZBD # NO

check_or ABC # YES
check_or ABD # YES
check_or ZBC # YES
check_or ZBD # NO