Bash中的简单逻辑运算符

我有几个变量,我想检查以下条件(写在文字,然后我在bash脚本失败的尝试):

if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then


do something


done.

在我失败的尝试中,我想到了:

if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) );
then
scale=0.05
fi
377427 次浏览

非常接近

if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]];
then
scale=0.05
fi

应该工作。

把它分解

[[ $varA -eq 1 ]]

是一个整数比较 Where as

$varB == 't1'

是一个字符串比较。 否则,我只是正确地分组比较

双方括号分隔条件表达式。并且,我发现下面是关于这个主题的一个很好的阅读:“(IBM)解密测试,[,[[,((,和if-then-else”

你所写的几乎是可行的(如果所有变量都是数字的话),但这根本不是一个惯用的方法。

  • (…)括号表示一个亚层。它们里面的东西不像许多其他语言中的表达式。它是一个命令列表(就像外面的括号一样)。这些命令在单独的子进程中执行,因此在圆括号内执行的任何重定向、赋值等在圆括号外不起作用。
    • 有一个前导的美元符号,$(…)命令替换:圆括号内有一个命令,命令的输出被用作命令行的一部分(在额外的展开之后,除非在双引号之间进行替换,但那是另一个故事)。
    • 李< / ul > < / >
    • { … }大括号就像圆括号一样,它们对命令进行分组,但它们只影响解析,不影响分组。程序x=2; { x=4; }; echo $x输出4,而x=2; (x=4); echo $x输出2。(同样,大括号需要空格和结束前的分号,而括号则不需要。这只是一个语法错误。)
      • 前面有一个美元符号,${VAR}是一个参数扩展,扩展到一个变量的值,可能有额外的转换。
      • 李< / ul > < / >
      • ((…))双括号环绕算术运算指令,即整数的计算,其语法类似于其他编程语言。此语法主要用于赋值和条件语句。
        • 算术表达式$((…))也使用了相同的语法,它扩展为表达式的整数值。
        • 李< / ul > < / >
        • [[ … ]]双括号括起-n $variable8。条件表达式大多构建在-n $variable9上,例如-n $variable用于测试变量是否为空,-e $file用于测试文件是否存在。还有字符串相等操作符:"$string1" == "$string2"(注意右边是一个模式,例如,[[ $foo == a* ]]测试是否$fooa开头,而[[ $foo == "a*" ]]测试是否$foo恰好是a*),以及熟悉的-n $variable0、-n $variable1和-n $variable2操作符用于否定、连接和分离,以及用于分组的括号。注意,每个操作符周围需要一个空格(例如-n $variable3,而不是-e $file0),括号内外都需要一个空格或字符,如-n $variable5(例如-n $variable6,而不是-e $file1)。
        • [ … ]单括号是条件表达式的另一种形式,有更多的怪癖(但更古老,更可移植)。现在不要写任何东西;当您发现包含它们的脚本时,请开始担心它们。

        这是在bash中编写测试的惯用方法:

        if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
        

        如果你需要可移植性到其他shell,这将是一种方法(注意附加的引号和围绕每个单独测试的单独的括号,以及使用传统的=操作符而不是ksh/bash/zsh ==变体):

        if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then
        
if ([ $NUM1 == 1 ] || [ $NUM2 == 1 ]) && [ -z "$STR" ]
then
echo STR is empty but should have a value.
fi

一个非常便携的版本(甚至是遗留的bourne shell):

if [ "$varA" = 1 -a \( "$varB" = "t1" -o "$varB" = "t2" \) ]
then    do-something
fi

这有一个额外的特性,即最多只运行一个子进程(即进程[),无论shell类型如何。

如果变量包含数值,则将=替换为-eq

  • 3 -eq 03是正确的,但是
  • 3 = 03是假的。(字符串比较)

下面是if-then-else语句的简短版本:

( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"

注意以下几点:

  1. if条件中的||&&操作数(即圆括号之间)是逻辑操作数(或/和)

  2. if条件外的||&&操作数表示then/else

实际上,该声明说:

If (a=1或b=2) then "ok" else "nok"