Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2079161
  • 博文数量: 470
  • 博客积分: 10206
  • 博客等级: 上将
  • 技术积分: 5620
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-03 12:50
文章分类

全部博文(470)

文章存档

2012年(1)

2011年(18)

2010年(47)

2009年(404)

分类:

2009-05-28 09:17:17

[] [] [] [] []
   

精灵王




CU编号: 6175
注册:2002-4-2
最后登录: 2009-05-25
帖子:
精华:







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-12 08:45 
我看有的书说可以用[ 某条件 ]替代 test 某条件,也有的书介绍用[[ 某条件 ]]来替代 test 某条件,我看了一些shell脚本,确实有的脚本用
if [ 某条件 ]; then
  some statement
fi

有的脚本用
if [[ 某条件 ]]; then
  smoe statement
fi

它们之间有什么区别吗?



您对本贴的看法:
| |
  美女
精灵使




CU编号: 60743
注册:2003-6-2
最后登录: 2006-08-29
帖子:
精华:







来自:FreeSpace
状态:...保密...

[] [] [博客]


[]   顶部
发表于 2004-3-12 11:35 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

[[]]支持通配符,



您对本贴的看法:

__________________________________

/
| |

精灵王




CU编号: 6175
注册:2002-4-2
最后登录: 2009-05-25
帖子:
精华:







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-12 13:01 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

谢谢你的回答,除了这一点外还有别的区别吗?



您对本贴的看法:
| |

风云使者



CU编号: 34638
注册:2002-12-17
最后登录: 2008-11-24
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 09:04 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

不同的shell会支持不一样的.
bounse shell 应该不支持[[  ]],你可以试一下看它会不会报错
ksh [[ ]]应该支持



您对本贴的看法:
| |
  美女
风云使者




CU编号: 143636
注册:2004-3-19
最后登录: 2008-12-12
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 09:28 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

bjmm太强了!!!
佩服你!



您对本贴的看法:
| |
  帅哥
法师



CU编号: 73482
注册:2003-7-21
最后登录: 2009-05-27
帖子:
精华:







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 10:33 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

bjmm就是厉害!



您对本贴的看法:

__________________________________

强烈要求日本将琉球群岛归还中国!!!
还我琉球省!!!


构造完美代码
追究精致境界
反对随意修补
鄙视破坏和谐
| |

天使




CU编号: 94159
注册:2003-9-7
最后登录: 2009-05-27
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 11:07 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

bjmm?



您对本贴的看法:
| |
  美女
精灵使




CU编号: 60743
注册:2003-6-2
最后登录: 2006-08-29
帖子:
精华:







来自:FreeSpace
状态:...保密...

[] [] [博客]


[]   顶部
发表于 2004-3-29 11:27 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

[quote]原帖由 "zhouhaiming"]谢谢你的回答,除了这一点外还有别的区别吗?[/quote 发表:

做个比较吧 环境:bash/ksh :oops:

CODE:
$a=1 b=2
$[ $a > $b ]&&echo ok||echo error
ok
$[[ $a > $b ]]&&echo ok||echo error
error

ps:我个人认为[[...]]是[...]和test命令的增强"版"



您对本贴的看法:

__________________________________

/
| |
  帅哥
精灵王




CU编号: 132981
注册:2004-2-14
最后登录: 2009-02-11
帖子:
精华:0







来自:初学者园地
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 12:01 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

窃以为:

[[ ]]是shell内部命令,许多shell不支持这种方式。
[]是外部命令,是通用指令。

[] 中不支持 < >判断,应使用 -gt -lt代替,上述指令应为:
[ $a -gt $b ]&&echo ok||echo error

请各大师指正。



您对本贴的看法:
| |

风云使者




CU编号: 6059
注册:2002-3-30
最后登录: 2008-09-26
帖子:
精华:







来自:DNT
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-29 20:43 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

[[ 更多用于数字判断
是shell的关键字

[ = test 是shell的内置命令



您对本贴的看法:
| |
[] [] [] [] []
   
  美女
精灵使




CU编号: 60743
注册:2003-6-2
最后登录: 2006-08-29
帖子:
精华:







来自:FreeSpace
状态:...保密...

[] [] [博客]


[]   顶部
发表于 2004-3-29 20:51 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

ksh对[..]和[[..]]的解释:

QUOTE:
(( expression ))
              The arithmetic expression expression is evaluated; equivalent to
              let "expression".  See Arithmetic Expressions and the  let  com-
              mand below.

       [[ expression ]]
              Similar to the test and [ ... ] commands (described later), with
              the following exceptions:
                o    Field splitting and file name  generation  are  not  per-
                     formed on arguments.
                o    The  -a  (and) and -o (or) operators are replaced with &&
                     and ||, respectively.
                o    Operators (e.g., -f, =, !, etc.) must be unquoted.
                o    The second operand of != and = expressions  are  patterns
                     (e.g., the comparison in
                                        [[ foobar = f*r ]]
                     succeeds).
                o    There  are two additional binary operators: < and > which
                     return true if their first string operand is  less  than,
                     or  greater  than,  their  second string operand, respec-
                     tively.
                o    The single argument form of  test,  which  tests  if  the
                     argument  has  non-zero  length,  is not valid - explicit
                     operators must be always be used, e.g., instead of
                                              [ str ]
                     use
                                           [[ -n str ]]
o    Parameter, command and arithmetic substitutions are  per-
                     formed  as  expressions are evaluated and lazy expression
                     evaluation is used for the &&  and  ||  operators.   This
                     means that in the statement
                                  [[ -r foo && $(< foo) = b*r ]]
                     the  $(<  foo)  is  evaluated if and only if the file foo
                     exists and is readable.




您对本贴的看法:

__________________________________

/
| |
  美女
精灵使




CU编号: 60743
注册:2003-6-2
最后登录: 2006-08-29
帖子:
精华:







来自:FreeSpace
状态:...保密...

[] [] [博客]


[]   顶部
发表于 2004-3-29 20:57 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

[quote]原帖由 "panlm"]是shell的内置命令[/quote 发表:

在ksh的惯例,[[...]]是对字符类变量进行判断,而对数字变量的判断则用((...)),当然,这不过是一个惯例而已,便于清晰的阅读代码,别的shell我不敢妄加评论,对ksh,我还是比较"在行"的 :oops:



您对本贴的看法:

__________________________________

/
| |
  帅哥
圣骑士



CU编号: 139839
注册:2004-3-5
最后登录: 2006-05-27
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-30 09:23 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

[[]] 可以对字符串进行大小比较,基于字典顺序的比较。



您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-31 19:01 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

顶一下!



您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-31 19:04 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

对不起,发重了,删掉这一贴。



您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2004-3-31 19:07 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

1. 首先,尽管很相似,但是从概念上讲,二者是不同层次的东西。
"[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
"["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(如果有这样的命令的话)。
下面是在rh7.3下的测试结果,GNU bash, version 2.05a.0(1),安装了sh-utils。

CODE:
$ type test
test is a shell builtin
$ type [
[ is a shell builtin
$ rpm -ql sh-utils|grep test
/usr/bin/test
/usr/share/man/man1/test.1.gz
$ ls -l `which test`
-rwxr-xr-x    1 root     root        20424  4月  9  2002 /usr/bin/test
ls -l $(which [)
lrwxrwxrwx    1 root     root            4  8月 23  2002 /usr/bin/[ -> test

在你的机器上结果可能会有所不同哦。

2. 相同的地方是二者都支持算术比较和字符串比较表达式。
举例(测试环境bash 2.05b.0(1),下同):

CODE:
$ [ 2 -lt 10 ]&&echo true&&echo false
true
$  [ 2 -gt 10 ]&&echo true||echo false
false
$  [ 2 \< 10 ]&&echo true||echo false  #you should use "\<"
false
$  [ 2 \> 10 ]&&echo true||echo false  #you should use "\>"
true



CODE:
$  [[ 2 -gt 10 ]]&&echo true||echo false
false
$  [[ 2 -lt 10 ]]&&echo true||echo false
true
$  [[ 2 < 10 ]]&&echo true||echo false
false
$  [[ 2 > 10 ]]&&echo true||echo false
true



CODE:
$ [ test = test ]&&echo true||echo false  #normal compare
true
$ [ test = t*t ]&&echo true||echo false  #pattern match.
true
$ [ test = t..t ]&&echo true||echo false  #not match.
false
$ [ test = t??t ]&&echo true||echo false  #note that "?", not "." stands for one single character here
true
$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the pattern
false



CODE:
$ [[ test = test ]]&&echo true||echo false  #normal compare
true
$ [[ test = t*t ]]&&echo true||echo false  #pattern match.
true
$ [[ test = t..t ]]&&echo true||echo false  #not match.
false
$ [[ test = t??t ]]&&echo true||echo false  #note that "?", not "." stands for one single character here
true
$ [[ test = "t??t" ]]&&echo true||echo false #alert: don't quote the pattern
false

说明:
"-gt", "-lt"是算术比较操作符,用于比较整数的大小。

">", "<"是字符串比较操作符,用于比较字符串的大小,使用字典顺序,与当前的locale有关。

另外,"="还可以做简单的模式匹配,与一般的正则表达式不同,这里的模式匹配要简单得多,类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起。

第2点是谈相同点,以下的都是二者"行为上"的不同点。

3. [[的行为相对地更接近于其他语言,例如"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或"。
例如:

CODE:
$ [[ 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
$ [ 1 < 2 \&\& b > a ]&&echo true||echo false  #aslo wrong
bash: [: &&: binary operator expected
false

4. [ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"<"必须转义,否则就变成IO改向操作符了(请参看上面2中的例子)。在[[中"<"与">"不需转义;
由于"[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如
在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做。
举例:

CODE:
$ [ "-z" "" ]&&echo true||echo false
true
$ [ -z "" ]&&echo true||echo false
true
$ [[ "-z" "" ]]&&echo true||echo false
bash: conditional binary operator expected
bash: syntax error near `""'
$ [[ -z "" ]]&&echo true||echo false
true

5. [[ ... ]]进行算术扩展,而[ ... ]不做。
举例:

CODE:
$ [[ 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




您对本贴的看法:
| |
  帅哥
精灵



CU编号: 175024
注册:2004-8-4
最后登录: 2008-11-28
帖子:
精华:







来自:HUNAN
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-10 16:16 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

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 ]]
使用 (( )) 时,不需要空格分隔各值和运算符,使用 [[ ]] 时需要用空格分隔各值和运算符。

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 ]] 。



您对本贴的看法:

__________________________________



!!

| |
  帅哥
天使



CU编号: 184153
注册:2004-9-17
最后登录: 2009-03-31
帖子:
精华:







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-10 19:47 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

受益匪浅,谢谢大家见仁见智!



您对本贴的看法:

__________________________________

TO BE MY PERSONAL BEST!
已责人之心责己,以恕己之心恕人!
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-11 14:34 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

shaoping0330的钻研精神让人佩服。我再补充几点:

1.((...))等价于let,专门用来进行算术运算、比较,bsh中也可以使用,而且最妙的是它支持C风格的运算符。要取得算术表达式的值时可以用"$((expression))"形式
举例:

CODE:
$ ((i=1+99)) ; echo $i
100
$ echo $((i++))
101
$ echo $((--i))
100
$ echo $((2**3))
8
$ echo $((5%3))
2
$ echo $((1<2?10:20))
10

2.test 等价于[],与[[]]相似但有些区别;既可用于算术运算、比较又可用于字符串、文件测试。算术比较用 -eq, -lt, -gt, -le, -ge,字符串比较用<, >, =, !=, >=和<=这两个是无效的。[]中逻辑运算用:-a, -o,而[[中用&&, ||;[[不能用于bsh,但可用在ksh/bash/zsh中。

3.正如我在以前的帖子中指出的,可以把[...]看作一个shell命令,方括号中的内容就是命令行参数。所以"<"、">"并不是不可以用在[...]中,只不过他们是shell的"元字符",使用前必须用"\"转义,去掉其特殊含义就可以了。

4.关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如 A",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。至于不要使 用"<"、">"的意见,我不能苟同。:)

5.((...))的结构对于算术运算应该大力提倡,这一点我非常赞成。

6.shaoping说[[在bash与ksh中不同,是指什么?请指教。我对ksh不是很熟。:-(



您对本贴的看法:
| |
  帅哥
精灵



CU编号: 175024
注册:2004-8-4
最后登录: 2008-11-28
帖子:
精华:







来自:HUNAN
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-12 17:03 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

更正:在ksh和bash-2.05b,[[ ]]是一样。至少在我目前的相关测试中! :D


数字测试        -eq -ne -lt -le -gt -ge         [[ ]]同 [ ]
文件测试        -r、-l、-w、-x、-f、-d、-s、-nt、-ot         [[ ]]同 [ ]
字符串测试        =  !=  -n  -z        [[ ]]同 [ ]
逻辑测试        []为 -a -o !         [[ ]] 为&&  || !
数学运算        [] 不可以使用        [[ ]]可以使用+  -  *  /  %
组合        均可用各自逻辑符号连接的数字(运算)测试、文件测试、字符测试

情况比较复杂的是字符的测试:字符测试
==        同=        [ ]与[[ ]]同       
<= >=        同=均不可以使用
< >        在 [] 内比较结果异常,如:$ [ 44 > 45 ] 与 $ [ 45 > 44 ]的返回值一样$ [ ccca > ccccb ]与$ [ ccccb > ccca ]的返回值一样       
< >(首个单挑)        在[[]] 根据相应ASCII码比较(如果是多个字母或数字组合,则先比较首个,若相同则接着比较下一个)
\> \<(首个单挑)        在 [] 内根据相应ASCII码比较(如果是多个字母或数字组合,则先比较首个,若相同则接着比较下一个)       
\> \<        在 [[]] 不可以使用

redhat9:bash-2.05b下测试(下图)




(10.64 KB) 2005-1-12 17:03
 


您对本贴的看法:

__________________________________



!!

[] [] [] [] []
   
  帅哥
精灵



CU编号: 175024
注册:2004-8-4
最后登录: 2008-11-28
帖子:
精华:







来自:HUNAN
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-12 17:18 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。
不过对于数字的运算和测试,建议大家都使用  (( )) ,这样更一目了然!

我以前看的shell资料,字符的比较一直都只说了 = != -n -z 这几个,看了woodie兄台所提到的第 4 点,才发现自己 ~~~ “关在圈子里出不去了”
补充了   大于 小于 的比较,字符的测试也就差不多完整了!

不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 > < 其结果会很迷惑的。



您对本贴的看法:

__________________________________



!!

| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-1-12 18:43 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

>相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。
我的意见两者都是可靠的,尽可以大胆使用。实际上[]的兼容性更好些,因为在bsh这样古老的shell中也能使用;[[]]则只能用于ksh及其后继者bash、zsh中。

>不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 > < 其结果会很迷惑的。
看来shaoping兄还是没搞清楚,大概是我前面都没写清楚吧。:)
"<"和">"可以直接用在[[]]中。但可以直接用在[]中,只能加"\"转义后或者用引号括起后使用,否则shell就会把它解释为输入输出改向符。
看例子:

CODE:
$ ls 200?
ls: 200?: No such file or directory
$ [ 2004 < 2005 ]
bash: 2005: No such file or directory
$ echo $?
1
$ [ 2004 > 2005 ]
$ echo $?
0
$ ls 200?
2005

首先列一下目录,保证没有200?字样的文件存在。
然后执行[ 2004 < 2005 ],shell试图对文件2005作标准输入,但无法找到文件2005。
执行[ 2004 > 2005 ],系统正常执行了命令。
再列下目录,已经生成了文件2005!
再看:

CODE:
$ [ 2004 "<" 2006 ]&&echo true||echo false
true
$ [ 2004 '>' 2006 ]&&echo true||echo false
false
$ [ 2004 \> 2006 ]&&echo true||echo false
false

看到了吧,去掉了特殊含义的"<"和">"就表现得规规矩矩的了。:)



您对本贴的看法:
| |

圣骑士



CU编号: 158843
注册:2004-5-17
最后登录: 2008-04-07
帖子:
精华:0







状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-3-8 23:29 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

我觉得[[和[的不同有两点:
1. [[支持模式匹配,而[不支持
2. [[测试逻辑运算要用&&或||,而[要用-a或-o

而let运算符(())主要用于算术运算和整数测试,在用于整数测试时,可以用[ -gt]等test命令替换,但建议所有算术运算和测试都用let命令实现.



您对本贴的看法:

__________________________________

同是天涯沦落人,相逢何必曾相识
| |

精灵使



CU编号: 6382
注册:2002-4-5
最后登录: 2009-05-20
帖子:
精华:







来自:江苏
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-3-24 21:06 
请问替代test语句的[ ]和[[ ]]表达式有什么区别啊

学到新知识,好文章!!



您对本贴的看法:
| |
  帅哥
精灵王



CU编号: 135781
注册:2004-2-24
最后登录: 2008-10-25
帖子:
精华:







来自:广东省中山市
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 14:17 
要总结消化才行啊。我这里每次测试的 ">;"都是提示错误如下:

CODE:
[root@PostFix shell]# [ d>;c ]&&echo ok||echo fail
[root@PostFix shell]#-bash: syntax error near unexpected token `;'

然后用了转义"\"同样的出现错误

CODE:
[root@PostFix shell]# [ d\>;c ]&&echo ok||echo fail
bash: [: missing `]'
-bash: c: command not found
fail

而直接用 "\"+">"即 "\>"就可以实现了哦。

CODE:
[root@PostFix shell]# [ d\>c ]&&echo ok||echo fail
ok

这样反而OK,我是在redhat as3下面的bash环境下测试的。为何和你们所说的不一样呢?



您对本贴的看法:

__________________________________

达芙妮新店开张
| |
  帅哥
老法王


CU奥运火炬传递手2008
荣誉会员  
CU编号: 187152
注册:2004-10-1
最后登录: 2009-05-27
帖子:
精华:







来自:北京海淀
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 14:29 


QUOTE:
原帖由 佛光普照 于 2005-12-26 14:17 发表
要总结消化才行啊。我这里每次测试的 ">;"都是提示错误如下:

[code][root@PostFix shell]# [ d>;c ]&&echo ok||echo fail
[root@PostFix shell]#-bash: syntax error near unexpect ...

[]对于逻辑判断,要远远不如用[[]],因此推加使用[[]]



您对本贴的看法:

__________________________________


Window$ XP Professional service pack 2
CYGWIN_NT-5.1 + GNU bash version 3.2.39

| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 15:49 


QUOTE:
原帖由 佛光普照 于 2005-12-26 14:17 发表
要总结消化才行啊。我这里每次测试的 ">;"都是提示错误如下:
...

呵呵,这个难怪你搞糊涂了。原贴中的">"后面并没有“;”,可能是论坛系统升级后系统在后台作转换时有点bug吧。这个有点shell常识的应该看得出来,不过初学者就难免莫名其妙了。这一点还请大家阅读时注意。
这个应该烦请版主示下:到底应该怎样消除这个错误?最好是修改程序,免得跟帖的每个人都重新修改。有的网友可能已经很久不来了。

我还是先修改一下自己的帖子吧。对大家造成的误导和困扰,对不起了!

我的三个帖子,原样贴在下面,请参考。不便之处,请大家原谅!shaoping兄或其他人的帖子,最好还是请本人修改。

[ 本帖最后由 woodie 于 2005-12-26 16:28 编辑 ]



您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 16:17 
16楼的克隆:

###请大家注意:
#可能是论坛系统升级后系统在后台作转换时有点bug吧。本人的帖子中的“>”后奇怪的多了以各分号“;”,造成有的网友阅读时的混淆和困扰。详见 25楼佛光普照兄的帖子。在此woodie跟大家say sorry了!我把自己16楼的帖子原样搬到这里,去掉了那些些莫名其妙多出来的“;”。特此说明。以下是16楼的内容:

1. 首先,尽管很相似,但是从概念上讲,二者是不同层次的东西。
"[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
"["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(如果有这样的命令的话)。
下面是在rh7.3下的测试结果,GNU bash, version 2.05a.0(1),安装了sh-utils。

CODE:
$ type test
test is a shell builtin
$ type [
[ is a shell builtin
$ rpm -ql sh-utils|grep test
/usr/bin/test
/usr/share/man/man1/test.1.gz
$ ls -l `which test`
-rwxr-xr-x    1 root     root        20424  4月  9  2002 /usr/bin/test
ls -l $(which [)
lrwxrwxrwx    1 root     root            4  8月 23  2002 /usr/bin/[ -> test

在你的机器上结果可能会有所不同哦。

2. 相同的地方是二者都支持算术比较和字符串比较表达式。
举例(测试环境bash 2.05b.0(1),下同):

CODE:
$ [ 2 -lt 10 ]&&echo true&&echo false
true
$  [ 2 -gt 10 ]&&echo true||echo false
false
$  [ 2 \< 10 ]&&echo true||echo false  #you should use "\<"
false
$  [ 2 \> 10 ]&&echo true||echo false  #you should use "\>"
true



CODE:
$  [[ 2 -gt 10 ]]&&echo true||echo false
false
$  [[ 2 -lt 10 ]]&&echo true||echo false
true
$  [[ 2 < 10 ]]&&echo true||echo false
false
$  [[ 2 > 10 ]]&&echo true||echo false
true



CODE:
$ [ test = test ]&&echo true||echo false  #normal compare
true
$ [ test = t*t ]&&echo true||echo false  #pattern match.
true
$ [ test = t..t ]&&echo true||echo false  #not match.
false
$ [ test = t??t ]&&echo true||echo false  #note that "?", not "." stands for one single character here
true
$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the pattern
false



CODE:
$ [[ test = test ]]&&echo true||echo false  #normal compare
true
$ [[ test = t*t ]]&&echo true||echo false  #pattern match.
true
$ [[ test = t..t ]]&&echo true||echo false  #not match.
false
$ [[ test = t??t ]]&&echo true||echo false  #note that "?", not "." stands for one single character here
true
$ [[ test = "t??t" ]]&&echo true||echo false #alert: don't quote the pattern
false

说明:
"-gt", "-lt"是算术比较操作符,用于比较整数的大小。

">", "<"是字符串比较操作符,用于比较字符串的大小,使用字典顺序,与当前的locale有关。

另外,"="还可以做简单的模式匹配,与一般的正则表达式不同,这里的模式匹配要简单得多,类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起。

第2点是谈相同点,以下的都是二者"行为上"的不同点。

3. [[的行为相对地更接近于其他语言,例如"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或"。
例如:

CODE:
$ [[ 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
$ [ 1 < 2 \&\& b > a ]&&echo true||echo false  #aslo wrong
bash: [: &&: binary operator expected
false

4. [ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"<"必须转义,否则就变成IO改向操作符了(请参看上面2中的例子)。在[[中"<"与">"不需转义;
由于"[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如
在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做。
举例:

CODE:
$ [ "-z" "" ]&&echo true||echo false
true
$ [ -z "" ]&&echo true||echo false
true
$ [[ "-z" "" ]]&&echo true||echo false
bash: conditional binary operator expected
bash: syntax error near `""'
$ [[ -z "" ]]&&echo true||echo false
true

5. [[ ... ]]进行算术扩展,而[ ... ]不做。
举例:

CODE:
$ [[ 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




您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 16:21 
19楼的克隆:

shaoping0330的钻研精神让人佩服。我再补充几点:

1.((...))等价于let,专门用来进行算术运算、比较,bsh中也可以使用,而且最妙的是它支持C风格的运算符。要取得算术表达式的值时可以用"$((expression))"形式
举例:

CODE:
$ ((i=1+99)) ; echo $i
100
$ echo $((i++))
101
$ echo $((--i))
100
$ echo $((2**3))
8
$ echo $((5%3))
2
$ echo $((1<2?10:20))
10

2.test 等价于[],与[[]]相似但有些区别;既可用于算术运算、比较又可用于字符串、文件测试。算术比较用 -eq, -lt, -gt, -le, -ge,字符串比较用<, >, =, !=, >=和<=这两个是无效的。[]中逻辑运算用:-a, -o,而[[中用&&, ||;[[不能用于bsh,但可用在ksh/bash/zsh中。

3.正如我在以前的帖子中指出的,可以把[...]看作一个shell命令,方括号中的内容就是命令行参数。所以"<"、">"并不是不可以用在[...]中,只不过他们是shell的"元字符",使用前必须用"\"转义,去掉其特殊含义就可以了。

4.关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如 A",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。至于不要使 用"<"、">"的意见,我不能苟同。:)

5.((...))的结构对于算术运算应该大力提倡,这一点我非常赞成。

6.shaoping说[[在bash与ksh中不同,是指什么?请指教。我对ksh不是很熟。:-(



您对本贴的看法:
| |
  帅哥
大天使




荣誉会员  
CU编号: 51293
注册:2003-4-10
最后登录: 2009-05-22
帖子:
精华:







来自:西安
状态:...离线...

[] [] [博客]


[]   顶部
发表于 2005-12-26 16:24 
22楼的克隆:

>相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。
我的意见两者都是可靠的,尽可以大胆使用。实际上[]的兼容性更好些,因为在bsh这样古老的shell中也能使用;[[]]则只能用于ksh及其后继者bash、zsh中。

>不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 > < 其结果会很迷惑的。
看来shaoping兄还是没搞清楚,大概是我前面都没写清楚吧。:)
"<"和">"可以直接用在[[]]中。但可以直接用在[]中,只能加"\"转义后或者用引号括起后使用,否则shell就会把它解释为输入输出改向符。
看例子:

CODE:
$ ls 200?
ls: 200?: No such file or directory
$ [ 2004 < 2005 ]
bash: 2005: No such file or directory
$ echo $?
1
$ [ 2004 > 2005 ]
$ echo $?
0
$ ls 200?
2005

首先列一下目录,保证没有200?字样的文件存在。
然后执行[ 2004 < 2005 ],shell试图对文件2005作标准输入,但无法找到文件2005。
执行[ 2004 > 2005 ],系统正常执行了命令。
再列下目录,已经生成了文件2005!
再看:

CODE:
$ [ 2004 "<" 2006 ]&&echo true||echo false
true
$ [ 2004 '>' 2006 ]&&echo true||echo false
false
$ [ 2004 \> 2006 ]&&echo true||echo false
false

看到了吧,去掉了特殊含义的"<"和">"就表现得规规矩矩的了。:)




阅读(1099) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~