1. 首先,尽管很类似,可是从概念上讲,两者是不一样层次的东西。
"[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(听说从2.02起引入对[[的支持)等支持。
"["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(若是有这样的命令的话)。 php
2.[[]]结构比Bash版本的[]更通用。在[[和]]之间的全部的字符都不会被文件扩展或是标记分割,可是会有参数引用和命令替换。 shell
用[[ ... ]]测试结构比用[ ... ]更能防止脚本里的许多逻辑错误。好比说,&&,||,<和>操做符能在一个[[]]测试里经过,但在[]结构会发生错误。 bash
3.(( ))结构扩展并计算一个算术表达式的值。若是表达式值为0,会返回1或假做为退出状态码。一个非零值的表达式返回一个0或真做为退出状态码。这个结构和先前test命令及[]结构的讨论恰好相反。 测试
4.[ ... ]为shell命令,因此在其中的表达式应是它的命令行参数,因此串比较操做符">" 与"<"必须转义,不然就变成IO改向操做符了(请参看上面2中的例子)。在[[中"<"与">"不需转义;
因为"[["是关键字,不会作命令行扩展,于是相对的语法就稍严格些。例如
在[ ... ]中能够用引号括起操做符,由于在作命令行扩展时会去掉这些引号,而在[[ ... ]]则不容许这样作。 ui
5.[[ ... ]]进行算术扩展,而[ ... ]不作 命令行
1)在ksh中的test
数字的运算可以使用let、(( )) ,其中运算时不须要变量$符号,运算符为 +、-、*、/、% ,不建议使用expr
数字的比较使用 (( )) ,其运算符 >、>=、<、<=、==、!=
可使用算术扩展,如:(( 99+1 <= 101 ))
字符表达式的比较使用 [[ ]] ,其运算符 =、!=、-n、-z
文件表达式的测试使用 [[ ]] ,其运算符 -r、-l、-w、-x、-f、-d、-s、-nt、-ot
逻辑表达式的测试使用 [[ ]] ,其运算符 !、&&、||
数字比较、字符比较、逻辑测试能够组合,如$ [[ "a" != "b" && 4 -gt 3 ]]
支持bash中的通配符扩展,如:[[ hest = h??t ]] 、[ hest = h*t ]]
使用 (( )) 时,不须要空格分隔各值和运算符,使用 [[ ]] 时须要用空格分隔各值和运算符。 get
2)bash与ksh中的 [[ ]] 不一样
在redhat9的bash中也可使用 [[ ]] 符号。可是建议严格按照上面的原则使用。
在 bash中,数字的比较最好使用 (( )),虽然说可使用 [[ ]],但若在其内使用运算符 >、>=、<、<=、==、!= 时,其结果常常是错误的,不过若在 [[ ]] 中使用 [ ] 中的运算符“-eq、-ne、-le、-lt、-gt、-ge”等,还还没有发现有错。所以诸如$ [[ " a" != “b” && 4 > 3 ]] 这类组合(见上)也不能够在bash中使用,其出错率很高。
例:[[ "a" != "b" && 10 > 2 ]] 判断结果就不正常。
诸如 [ 2 \< 10 ]、[[ 2 < 10 ]] 都是不要使用。使用算术扩展最好用 (( 99+1 == 100 )) ,而不要使用[[ 99+1 -eq 100 ]] 。 test