简单的逻辑运算符在Bash中

我有几个variables,我想检查下面的条件(写出来的话,然后我在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 

你所写的实际上几乎是可行的(如果所有的variables都是数字的话,这将起作用),但是这根本不是一种惯用的方式。

  • (…)括号表示一个子shell 。 里面的东西不像其他许多语言中的expression式。 这是一个命令列表(就像外部括号)。 这些命令是在一个单独的subprocess中执行的,所以在括号内执行的任何redirect,赋值等操作都不起作用。
    • 在美元符号的前面, $(…)是一个命令replace :在括号内有一个命令,命令的输出用作命令行的一部分(在额外扩展之后,除非replace是在双引号之间,这是另一个故事 )。
  • { … }大括号就像括号一样,它们对命令进行分组,但是它们只影响parsing,而不是分组。 程序x=2; { x=4; }; echo $x x=2; { x=4; }; echo $x x=2; { x=4; }; echo $x打印4,而x=2; (x=4); echo $x x=2; (x=4); echo $x x=2; (x=4); echo $x打印2.(括号在它们周围需要空格,在closures之前需要一个分号,而括号不需要,这只是一个语法问题。
    • 带有美元符号, ${VAR}是一个参数扩展 ,扩展到一个variables的值,可能会有额外的转换。
  • ((…))双括号包围一个算术指令 ,即整数计算,其语法类似于其他编程语言。 这个语法主要用于赋值和条件。
    • 在算术expression式$((…))使用相同的语法,它扩展为expression式的整数值。
  • [[ … ]]括号包围条件expression式 。 条件expression式大多build立在运算符上 ,如-n $variable来testingvariables是否为空, -e $file来testing文件是否存在。 还有string相等运算符: "$string1" = "$string2" (注意右边是一个模式,例如[[ $foo = a* ]]testing$foo是否以a while开头[[ $foo = "a*" ]]testing$foo是不是a* ),而熟悉的!&&|| 否定,合并和分离的运算符以及分组的括号。 请注意,每个运算符都需要一个空格(例如[[ "$x" = "$y" ]] ,而不是[[ "$x"="$y" ]] )以及空格或字符; 在括号内部和外部(例如[[ -n $foo ]] ,而不是[[-n $foo]] )。
  • 单括号是条件expression式的一种替代forms,具有更多的怪癖(但更老,更便携)。 现在不要写任何东西; 当你find包含它们的脚本时就开始担心它们了。

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

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

如果你需要其他shell的可移植性,这将是方式(注意每个单独testing附加的引用和括号的单独设置):

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

很接近

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

应该工作。

打破它

 [[ $varA -eq 1 ]] 

是一个整数比较在哪里

 $varB == 't1' 

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

双方括号分隔条件expression式。 而且,我发现以下是关于这个主题的一个很好的解读: “(IBM)揭秘testing,[,[[,((和if-then-else)

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

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

这样做有额外的质量,最多只能运行一个subprocess(这是进程'['),无论shell的风格如何。

如果variables包含数值,则将“=”replace为“-eq”,例如

  • 3 – 03年是真的,但是
  • 3 = 03是错误的。 (string比较)
 if ([ $NUM1 == 1 ] || [ $NUM2 == 1 ]) && [ -z "$STR" ] then echo STR is empty but should have a value. fi