参考:

https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3768903

1.双圆括号

The arithmeticexpressionis evaluated according to the rules
described below (see Shell Arithmetic).
If the value of the expression is non-zero, the return status is 0;
otherwise the return status is 1.  This is exactly equivalent to

2.双中括号

使用` `.``.``.` `条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如&&, ||, <, 和> 操作符能够正常存在于` `条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.

双方括号为字符串比较提供高级功能,模式匹配。如使用*作通配符。

if [[ $USER == r* ]]
then
   echo "Hello $USER"
else
   echo "Sorry, I don't know you"
fi


` `是关键字,可以直接支持 > < = && ||等符号,不用转义(只有字符串才可以用这些符号比较,数字还是要用-gt/-lt等比较)

   $ [[ 'a' > 'c' || 'b' < 'c' ]] && echo '1111111111' || echo "2222222222";
    1111111111

3.单中括号

[ ]是内置条件判断符号。字串比较符号> <  要加转义符号'\',多条件用 -a(and,表示&&) -o(or,表示||)连接;

  $ [ 'a' \> 'c' -a 'a' \> 'b' ] && echo 'left' || echo 'right';
    right


补充if

在if后面也不一定非得是test命令或者是用于条件判断的中括号结构( [ ] 或 ` ` ).

dir=/home/bozo 
if cd "$dir" 2>/dev/null; then     # "2>/dev/null" 会隐藏错误信息. 
  echo "Now in $dir." 
else 
   echo "Can't change to $dir." 
fi

与此相似, 在中括号中的条件判断也不一定非得要if不可, 也可以使用列表结构.

 var1=20 
 var2=22 
[ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2" 
 
home=/home/bozo 
[ -d "$home" ] || echo "$home directory does not exist."