符号 | [] 或 test | [[]] | (()) |
---|---|---|---|
边界空格 | 需要 | 需要 | 不需要 |
整数比较 | -eq -gt -lt -ge -le | -eq -gt -lt -ge -le | = 、>、 <、 >= 、<= |
字符串比较 | =、==、!= | =、==、!= | =、==、!= |
与或非运算符 | -a 、-o、! | &&、||、! | &&、||、! |
支持正则 | 不支持 | 支持 | 不支持 |
定位 | base | 其实是[]的字符串表达式增强版 | 其实是[]的数值表达式的增强版 |
实际应用 | |||
整数比较 | [ 10 > 9 ] ## 代表重定向 | [[ 10 > 9 ]] 部分bash版本才支持,不建议使用 | echo $((3>2)) #1 为真 |
字符串比较 | [ “abc” = “abc” ] # 0 [ “abc” != “ABC” ] # 0 | [[ “abc” = “abc” ]] # 0 [[ “abc” != “ABC” ]] # 0 [[ abc = ab? ]] # 0 | |
计算 | $[10+2] # 12 | $((10+2)) #12 | |
其它 | [ -n “$var” ] | [[ -n $var ]] |
关于最后一行的区别是,[[]]中不会进行分词和文件名展开,举个例子来说:
test@test-PC:~$ [ -n $var ]
test@test-PC:~$ echo $?
0
test@test-PC:~$ [[ -n $var ]]
test@test-PC:~$ echo $?
1
-n用于判断变量是否为空,若为空,则为假,echo $? 应该为1。但是上面代码中我没有定义var变量,echo $?却为0。这是因为[]会发生分词,将$a(空值)移除,相当于[-n],而[]中仅有一个参数且非空时会认为“真”,造成了这个小bug。
但是用 [[]] 不会出现此bug,或者[ -n “$var”] 将变量加上双引号。
小结
- test命令和[]完全一样,整数比较建议使用[ -gt ] ;
- 字符串比较建议用[[ ]],=和==功能等同;
- 数值计算建议用(()) ;