简单的逻辑运算符在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式 。 条件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