momo zone

调核人的blog

bash shell中[[ ]]与[ ]的区别

之前都不太搞懂这两个什么区别,感觉不能在这样蒙下去了,还是搞清楚比较好,翻翻书发觉还是很简单的,说白了其实就是前者是内置的运算符,后者是shell 命令。

与此类似的一个问题是() 和(()) 的区别, 前者是用来调整优先级及block分界,后者就是单纯的表示里面的内容是算数运算。

一,[[用”&&”而不是”-a”表示逻辑”与”,用”||”而不是”-o”表示逻辑”或”:

$ [[ 1 < 2 && b > a ]]&&echo true||echo false
true

$ [[ 1 < 2 -a b > a ]]&&echo true||echo false
bash: syntax error in conditional expression
bash: syntax error near `-a’

$ [ 1 < 2 -a b > a ]&&echo true||echo false
true

$ [ 1 < 2 && b > a ]&&echo true||echo false  #wrong syntax
bash: [: missing `]‘
false

二,[ … ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符”>” 与”<”必须转义,否则就变成IO改向操作符了。[[中”<“与”>”不需转义:
$  [ 2 \< 10 ]&&echo true||echo false  #you should use “\<”
false

$  [[ 2 < 10 ]]&&echo true||echo false
false

三,[[ … ]]进行算术扩展,而[ … ]不做。
$ [[ 99+1 -eq 100 ]]&&echo true||echo false
true

$ [ 99+1 -eq 100 ]&&echo true||echo false
bash: [: 99+1: integer expression expected
false

$ [ $((99+1)) -eq 100 ]&&echo true||echo false
true

四,[[]]能用正则,而[]不行

[root@test ccc]# [ “test.php” == *.php ] && echo true || echo false
false

[root@test ccc]# [[ “test.php” == *.php ]] && echo true || echo false
true

[root@test ccc]# [[ “t.php” == [a-z].php ]] && echo true || echo false
true

[root@test ccc]# [ “test.php” == “*.php” ] && echo true || echo false
false

[root@test ccc]# [[ “test.php” == “*.php” ]] && echo true || echo false
false

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: