[]和[[]] 区别

sh/bash/dash/ksh/zsh等Shell脚本
回复
bellszhu
帖子: 108
注册时间: 2010-12-18 19:46

[]和[[]] 区别

#1

帖子 bellszhu » 2012-02-01 18:09

1.
#!/bin/bash

if [[ ! -d test1 ]]
then
mkdir test1
fi

2.
#!/bin/bash

if [ ! -d test1 ]
then
mkdir test1
fi


今天在网上看到一脚本,里面的if语句后面的判断 用了两个中括号, 不明白为什么?? 因为用一个也可以,所以有疑问。
keep the faith
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: []和[[]] 区别

#2

帖子 枫叶饭团 » 2012-02-01 18:30

好像遇见过[]报错而必需用[[]]的例子,想不起也不知道 :em06
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: []和[[]] 区别

#3

帖子 tusooa » 2012-02-01 18:37

bellszhu 写了:1.
#!/bin/bash

if [[ ! -d test1 ]]
then
mkdir test1
fi

2.
#!/bin/bash

if [ ! -d test1 ]
then
mkdir test1
fi


今天在网上看到一脚本,里面的if语句后面的判断 用了两个中括号, 不明白为什么?? 因为用一个也可以,所以有疑问。
[[是关键字。[是内部命令。差不多。就是用[[方便点。[可移植性高点。
为了避免犯错建议还是用[[

代码: 全选

] ls -ld //
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: []和[[]] 区别

#4

帖子 枫叶饭团 » 2012-02-01 18:38

tusooa 写了:
bellszhu 写了:1.
今天在网上看到一脚本,里面的if语句后面的判断 用了两个中括号, 不明白为什么?? 因为用一个也可以,所以有疑问。
[[是关键字。[是内部命令。差不多。就是用[[方便点。[可移植性高点。
为了避免犯错建议还是用[[
学习了 :em11 :em11
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: []和[[]] 区别

#5

帖子 tusooa » 2012-02-01 18:42

枫叶饭团 写了:好像遇见过[]报错而必需用[[]]的例子,想不起也不知道 :em06
这主要是关于空格和引号的。

代码: 全选

] ls -ld //
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: []和[[]] 区别

#6

帖子 josephyoung » 2012-02-01 21:54

-
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

Re: []和[[]] 区别

#7

帖子 Think1st » 2012-02-15 20:46

bellszhu 写了:1.
#!/bin/bash

if [[ ! -d test1 ]]
then
mkdir test1
fi

2.
#!/bin/bash

if [ ! -d test1 ]
then
mkdir test1
fi


今天在网上看到一脚本,里面的if语句后面的判断 用了两个中括号, 不明白为什么?? 因为用一个也可以,所以有疑问。

代码: 全选

 
type [
[ is a shell builtin
type [[
[[ is a shell keyword
'[‘是一条命令,'[['是shell内的保留字。
当一个测试条件时候是等价的。

代码: 全选

 7 if [ -z "$VAL" ]
 8 then
 9         echo "The val is null"
10 fi

代码: 全选

  7 if [[-z "$VAL" ]]
 8 then
 9         echo "The val is null"
10 fi
结果一致。

相对于'[]','[[]]'又被称为复合命令,更加符合自然的用法。尤其是在多个测试条件的时候:'[[]]'可以直接用逻辑符号连接。
当两个测试条件时候:

代码: 全选

  if [[ -z "$VAL" && "$VAL" = "" ]]

代码: 全选

  if [ -z "$VAL" -a "$VAL" = "" ]
是等价的。

此外,在使用 = 或 != 操作符时,复合命令 [[ 还能在字符串上进行模式匹配。

代码: 全选

[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
0

代码: 全选

[ian@pinguino ~]$ [ "abc def .d,x--" == a[abc]*\ ?d* ]; echo $?
1
甚至还可以在 [[ 复合命令内执行算术测试,但是千万要小心。除非在 (( 复合命令内,否则 < 和 > 操作符会把操作数当成字符串比较并在当前排序序列中测试它们的顺序。

详见:http://www.ibm.com/developerworks/cn/li ... -test.html
在这里,问题比答案更抢手。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: []和[[]] 区别

#8

帖子 fanhe » 2012-02-16 10:36

所以我很讨厌 shell,支持 python!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: []和[[]] 区别

#9

帖子 eexpress » 2012-02-16 10:40

我可记得[[ 支持正则的。
● 鸣学
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: []和[[]] 区别

#10

帖子 fanhe » 2012-02-16 21:15

eexpress 写了:我可记得[[ 支持正则的。
别记了,man builtins 吧,要么就上其他脚本
不知道为什么,我越来越讨厌shell 了
头像
Methuselar
帖子: 122
注册时间: 2009-06-04 12:06
联系:

Re: []和[[]] 区别

#11

帖子 Methuselar » 2012-02-17 8:01

别把bash当回事即可。让ksh的纯净思维洗涤你的心灵...
Mea Culpa!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: []和[[]] 区别

#12

帖子 eexpress » 2012-02-17 9:01

fanhe, 你个还在搞bash的,跟我说别记了。 :em04
● 鸣学
头像
tosail2010
帖子: 83
注册时间: 2011-03-27 19:01
联系:

Re: []和[[]] 区别

#13

帖子 tosail2010 » 2012-02-24 12:50

是也非也,可以运行help [查看一下两者的用法。
A year's plan starts with spring.
回复