我有几个变量,我想检查以下条件(写在文字,然后我在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
非常接近
if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]]; then scale=0.05 fi
应该工作。
把它分解
[[ $varA -eq 1 ]]
是一个整数比较 Where as
$varB == 't1'
是一个字符串比较。 否则,我只是正确地分组比较
双方括号分隔条件表达式。并且,我发现下面是关于这个主题的一个很好的阅读:“(IBM)解密测试,[,[[,((,和if-then-else”
你所写的几乎是可行的(如果所有变量都是数字的话),但这根本不是一个惯用的方法。
(…)
$(…)
{ … }
x=2; { x=4; }; echo $x
x=2; (x=4); echo $x
${VAR}
((…))
$((…))
[[ … ]]
-n $variable
-e $file
"$string1" == "$string2"
[[ $foo == a* ]]
$foo
a
[[ $foo == "a*" ]]
a*
[ … ]
这是在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。
-eq
3 -eq 03
3 = 03
下面是if-then-else语句的简短版本:
( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"
注意以下几点:
if条件中的||和&&操作数(即圆括号之间)是逻辑操作数(或/和)
||
&&
if条件外的||和&&操作数表示then/else
实际上,该声明说:
If (a=1或b=2) then "ok" else "nok"