《开源时代》4月刊下载-4月29日更新 | 时代迎新贺礼 预存1000返300 |机房故事:一位IT主管的“心灵鸡汤”| windows嵌入式有奖征文| "CU伴我行"八周年有奖征文活动[打印][订阅][收藏][本帖文本页][推荐此主题给朋友,立即获积分] 本主题由 waker 于 2008-8-28 12:46 关闭 zhouhaiming精灵王CU编号:6175注册:2002-4-2最后登录:2009-05-25帖子:340精华:2可用积分:305(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]1楼发表于 2004-3-12 08:45 我看有的书说可以用[ 某条件 ]替代 test 某条件,也有的书介绍用[[ 某条件 ]]来替代 test 某条件,我看了一些shell脚本,确实有的脚本用if [ 某条件 ]; then some statementfi有的脚本用if [[ 某条件 ]]; then smoe statementfi它们之间有什么区别吗?您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 bjgirl 精灵使CU编号:60743注册:2003-6-2最后登录:2006-08-29帖子:4841精华:7可用积分:4833(小富即安)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:FreeSpace状态:...保密...[个人空间][短信][博客][推广获积分] [报告]2楼发表于 2004-3-12 11:35 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊[[]]支持通配符,您对本贴的看法:鲜花[0]臭蛋[0]__________________________________/[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 zhouhaiming精灵王CU编号:6175注册:2002-4-2最后登录:2009-05-25帖子:340精华:2可用积分:305(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]3楼发表于 2004-3-12 13:01 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊谢谢你的回答,除了这一点外还有别的区别吗?您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 carrierye风云使者CU编号:34638注册:2002-12-17最后登录:2008-11-24帖子:402精华:0可用积分:373(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]4楼发表于 2004-3-29 09:04 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊不同的shell会支持不一样的.bounse shell 应该不支持[[ ]],你可以试一下看它会不会报错ksh [[ ]]应该支持您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 kingbeg 风云使者CU编号:143636注册:2004-3-19最后登录:2008-12-12帖子:443精华:0可用积分:953(丰衣足食)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]5楼发表于 2004-3-29 09:28 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊bjmm太强了!!!佩服你!您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 飞灰橙 法师CU编号:73482注册:2003-7-21最后登录:2009-05-27帖子:6995精华:8可用积分:2310(小富即安)信誉积分:125专家积分:86 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]6楼发表于 2004-3-29 10:33 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊bjmm就是厉害!您对本贴的看法:鲜花[0]臭蛋[0]__________________________________强烈要求日本将琉球群岛归还中国!!!还我琉球省!!!构造完美代码追究精致境界反对随意修补鄙视破坏和谐[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 jigenxiang天使CU编号:94159注册:2003-9-7最后登录:2009-05-27帖子:1349精华:0可用积分:1361(家境小康)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]7楼发表于 2004-3-29 11:07 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊bjmm?您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 bjgirl 精灵使CU编号:60743注册:2003-6-2最后登录:2006-08-29帖子:4841精华:7可用积分:4833(小富即安)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:FreeSpace状态:...保密...[个人空间][短信][博客][推广获积分] [报告]8楼发表于 2004-3-29 11:27 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊[quote]原帖由 "zhouhaiming"]谢谢你的回答,除了这一点外还有别的区别吗?[/quote 发表:做个比较吧 环境:bash/ksh :oops:[Copy to clipboard] [ - ]CODE:$a=1 b=2$[ $a > $b ]&&echo ok||echo errorok$[[ $a > $b ]]&&echo ok||echo errorerrorps:我个人认为[[...]]是[...]和test命令的增强"版"您对本贴的看法:鲜花[0]臭蛋[0]__________________________________/[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 auser 精灵王CU编号:132981注册:2004-2-14最后登录:2009-02-11帖子:255精华:0可用积分:337(稍有积蓄)信誉积分:120专家积分:0 (本版:0)空间积分:0推广积分:0来自:初学者园地状态:...离线...[个人空间][短信][博客][推广获积分] [报告]9楼发表于 2004-3-29 12:01 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊窃以为:[[ ]]是shell内部命令,许多shell不支持这种方式。[]是外部命令,是通用指令。[] 中不支持 判断,应使用 -gt -lt代替,上述指令应为:[ $a -gt $b ]&&echo ok||echo error请各大师指正。您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 panlm风云使者CU编号:6059注册:2002-3-30最后登录:2008-09-26帖子:506精华:3可用积分:517(丰衣足食)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:DNT状态:...离线...[个人空间][短信][博客][推广获积分] [报告]10楼发表于 2004-3-29 20:43 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊[[ 更多用于数字判断是shell的关键字[ = test 是shell的内置命令您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 《开源时代》4月刊下载-4月29日更新 | 时代迎新贺礼 预存1000返300 |机房故事:一位IT主管的“心灵鸡汤”| windows嵌入式有奖征文| "CU伴我行"八周年有奖征文活动[打印][订阅][收藏][本帖文本页][推荐此主题给朋友,立即获积分] 本主题由 waker 于 2008-8-28 12:46 关闭 bjgirl 精灵使CU编号:60743注册:2003-6-2最后登录:2006-08-29帖子:4841精华:7可用积分:4833(小富即安)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:FreeSpace状态:...保密...[个人空间][短信][博客][推广获积分] [报告]11楼发表于 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: 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 && $( the $( exists and is readable.您对本贴的看法:鲜花[0]臭蛋[0]__________________________________/[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 bjgirl 精灵使CU编号:60743注册:2003-6-2最后登录:2006-08-29帖子:4841精华:7可用积分:4833(小富即安)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:FreeSpace状态:...保密...[个人空间][短信][博客][推广获积分] [报告]12楼发表于 2004-3-29 20:57 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊[quote]原帖由 "panlm"]是shell的内置命令[/quote 发表:在ksh的惯例,[[...]]是对字符类变量进行判断,而对数字变量的判断则用((...)),当然,这不过是一个惯例而已,便于清晰的阅读代码,别的shell我不敢妄加评论,对ksh,我还是比较"在行"的 :oops:您对本贴的看法:鲜花[0]臭蛋[0]__________________________________/[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 xyb 圣骑士CU编号:139839注册:2004-3-5最后登录:2006-05-27帖子:85精华:0可用积分:20(白手起家)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]13楼发表于 2004-3-30 09:23 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊[[]] 可以对字符串进行大小比较,基于字典顺序的比较。您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]14楼发表于 2004-3-31 19:01 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊顶一下!您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]15楼发表于 2004-3-31 19:04 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊对不起,发重了,删掉这一贴。您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]16楼发表于 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。[Copy to clipboard] [ - ]CODE:$ type testtest 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),下同):[Copy to clipboard] [ - ]CODE:$ [ 2 -lt 10 ]&&echo true&&echo falsetrue$ [ 2 -gt 10 ]&&echo true||echo falsefalse$ [ 2 \false$ [ 2 \> 10 ]&&echo true||echo false #you should use "\>"true[Copy to clipboard] [ - ]CODE:$ [[ 2 -gt 10 ]]&&echo true||echo falsefalse$ [[ 2 -lt 10 ]]&&echo true||echo falsetrue$ [[ 2false$ [[ 2 > 10 ]]&&echo true||echo falsetrue[Copy to clipboard] [ - ]CODE:$ [ test = test ]&&echo true||echo false #normal comparetrue$ [ 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 heretrue$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the patternfalse[Copy to clipboard] [ - ]CODE:$ [[ test = test ]]&&echo true||echo false #normal comparetrue$ [[ 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 heretrue$ [[ test = "t??t" ]]&&echo true||echo false #alert: don't quote the patternfalse说明:"-gt", "-lt"是算术比较操作符,用于比较整数的大小。">", "另外,"="还可以做简单的模式匹配,与一般的正则表达式不同,这里的模式匹配要简单得多,类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起。第2点是谈相同点,以下的都是二者"行为上"的不同点。3. [[的行为相对地更接近于其他语言,例如"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或"。例如:[Copy to clipboard] [ - ]CODE:$ [[ 1 a ]]&&echo true||echo falsetrue$ [[ 1 a ]]&&echo true||echo falsebash: syntax error in conditional expressionbash: syntax error near `-a'$ [ 1 a ]&&echo true||echo falsetrue$ [ 1 a ]&&echo true||echo false #wrong syntaxbash: [: missing `]'false$ [ 1 a ]&&echo true||echo false #aslo wrongbash: [: &&: binary operator expectedfalse4. [ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与""不需转义;由于"[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做。举例:[Copy to clipboard] [ - ]CODE:$ [ "-z" "" ]&&echo true||echo falsetrue$ [ -z "" ]&&echo true||echo falsetrue$ [[ "-z" "" ]]&&echo true||echo falsebash: conditional binary operator expectedbash: syntax error near `""'$ [[ -z "" ]]&&echo true||echo falsetrue5. [[ ... ]]进行算术扩展,而[ ... ]不做。举例:[Copy to clipboard] [ - ]CODE:$ [[ 99+1 -eq 100 ]]&&echo true||echo falsetrue$ [ 99+1 -eq 100 ]&&echo true||echo falsebash: [: 99+1: integer expression expectedfalse$ [ $((99+1)) -eq 100 ]&&echo true||echo falsetrue您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 shaoping0330 精灵CU编号:175024注册:2004-8-4最后登录:2008-11-28帖子:249精华:4可用积分:270(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:HUNAN状态:...离线...[个人空间][短信][博客][推广获积分] [报告]17楼发表于 2005-1-10 16:16 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊1)在ksh中的test数字的运算可使用let、(( )) ,其中运算时不需要变量$符号,运算符为 +、-、*、/、% ,不建议使用expr数字的比较使用 (( )) ,其运算符 >、>=、可以使用算术扩展,如:(( 99+1字符表达式的比较使用 [[ ]] ,其运算符 =、!=、-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中,数字的比较最好使用 (( )),虽说可以使用 [[ ]],但若在其内使用运算符>、>=、 3 ]] 这类组合(见上)也不可以在bash中使用,其出错率很高。例:[[ "a" != "b" && 10 > 2 ]] 判断结果就不正常。诸如 [ 2 \您对本贴的看法:鲜花[0]臭蛋[0]__________________________________?!!!?[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 bandt 天使CU编号:184153注册:2004-9-17最后登录:2009-03-31帖子:1072精华:6可用积分:923(丰衣足食)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]18楼发表于 2005-1-10 19:47 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊受益匪浅,谢谢大家见仁见智!您对本贴的看法:鲜花[0]臭蛋[0]__________________________________TO BE MY PERSONAL BEST!已责人之心责己,以恕己之心恕人![有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]19楼发表于 2005-1-11 14:34 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊shaoping0330的钻研精神让人佩服。我再补充几点:1.((...))等价于let,专门用来进行算术运算、比较,bsh中也可以使用,而且最妙的是它支持C风格的运算符。要取得算术表达式的值时可以用"$((expression))"形式举例:[Copy to clipboard] [ - ]CODE:$ ((i=1+99)) ; echo $i100$ echo $((i++))101$ echo $((--i))100$ echo $((2**3))8$ echo $((5%3))2$ echo $((1102.test等价于[],与[[]]相似但有些区别;既可用于算术运算、比较又可用于字符串、文件测试。算术比较用 -eq, -lt, -gt, -le,-ge,字符串比较用, =, !=, >=和3.正如我在以前的帖子中指出的,可以把[...]看作一个shell命令,方括号中的内容就是命令行参数。所以""并不是不可以用在[...]中,只不过他们是shell的"元字符",使用前必须用"\"转义,去掉其特殊含义就可以了。4.关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A",就表示是字符串比较,那么9 >100为真,因为这实际上等价于‘9’ >‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。至于不要使用""的意见,我不能苟同。:)5.((...))的结构对于算术运算应该大力提倡,这一点我非常赞成。6.shaoping说[[在bash与ksh中不同,是指什么?请指教。我对ksh不是很熟。:-(您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 shaoping0330 精灵CU编号:175024注册:2004-8-4最后登录:2008-11-28帖子:249精华:4可用积分:270(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:HUNAN状态:...离线...[个人空间][短信][博客][推广获积分] [报告]20楼发表于 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码比较(如果是多个字母或数字组合,则先比较首个,若相同则接着比较下一个)\> \\> \redhat9:bash-2.05b下测试(下图) 未命名.gif (10.64 KB) 2005-1-12 17:03 您对本贴的看法:鲜花[0]臭蛋[0]__________________________________?!!!? 《开源时代》4月刊下载-4月29日更新 | 时代迎新贺礼 预存1000返300 |机房故事:一位IT主管的“心灵鸡汤”| windows嵌入式有奖征文| "CU伴我行"八周年有奖征文活动[打印][订阅][收藏][本帖文本页][推荐此主题给朋友,立即获积分] 本主题由 waker 于 2008-8-28 12:46 关闭 shaoping0330 精灵CU编号:175024注册:2004-8-4最后登录:2008-11-28帖子:249精华:4可用积分:270(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:HUNAN状态:...离线...[个人空间][短信][博客][推广获积分] [报告]21楼发表于 2005-1-12 17:18 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。不过对于数字的运算和测试,建议大家都使用 (( )) ,这样更一目了然!我以前看的shell资料,字符的比较一直都只说了 = != -n -z 这几个,看了woodie兄台所提到的第 4 点,才发现自己 ~~~ “关在圈子里出不去了”补充了 大于 小于 的比较,字符的测试也就差不多完整了!不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 >您对本贴的看法:鲜花[0]臭蛋[0]__________________________________?!!!?[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]22楼发表于 2005-1-12 18:43 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊>相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。我的意见两者都是可靠的,尽可以大胆使用。实际上[]的兼容性更好些,因为在bsh这样古老的shell中也能使用;[[]]则只能用于ksh及其后继者bash、zsh中。>不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 >看来shaoping兄还是没搞清楚,大概是我前面都没写清楚吧。:)""可以直接用在[[]]中。但不可以直接用在[]中,只能加"\"转义后或者用引号括起后使用,否则shell就会把它解释为输入输出改向符。看例子:[Copy to clipboard] [ - ]CODE:$ ls 200?ls: 200?: No such file or directory$ [ 2004bash: 2005: No such file or directory$ echo $?1$ [ 2004 > 2005 ]$ echo $?0$ ls 200?2005首先列一下目录,保证没有200?字样的文件存在。然后执行[ 2004执行[ 2004 > 2005 ],系统正常执行了命令。再列下目录,已经生成了文件2005!再看:[Copy to clipboard] [ - ]CODE:$ [ 2004 "true$ [ 2004 '>' 2006 ]&&echo true||echo falsefalse$ [ 2004 \> 2006 ]&&echo true||echo falsefalse看到了吧,去掉了特殊含义的""就表现得规规矩矩的了。:)您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 launch401圣骑士CU编号:158843注册:2004-5-17最后登录:2008-04-07帖子:147精华:0可用积分:159(白手起家)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0状态:...离线...[个人空间][短信][博客][推广获积分] [报告]23楼发表于 2005-3-8 23:29 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊我觉得[[和[的不同有两点:1. [[支持模式匹配,而[不支持2. [[测试逻辑运算要用&&或||,而[要用-a或-o而let运算符(())主要用于算术运算和整数测试,在用于整数测试时,可以用[ -gt]等test命令替换,但建议所有算术运算和测试都用let命令实现.您对本贴的看法:鲜花[0]臭蛋[0]__________________________________同是天涯沦落人,相逢何必曾相识[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 li2002精灵使CU编号:6382注册:2002-4-5最后登录:2009-05-20帖子:3898精华:11可用积分:3440(小富即安)信誉积分:100专家积分:51 (本版:50)空间积分:825推广积分:0来自:江苏状态:...离线...[个人空间][短信][博客][推广获积分] [报告]24楼发表于 2005-3-24 21:06 请问替代test语句的[ ]和[[ ]]表达式有什么区别啊学到新知识,好文章!!您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 佛光普照 精灵王CU编号:135781注册:2004-2-24最后登录:2008-10-25帖子:347精华:1可用积分:378(稍有积蓄)信誉积分:100专家积分:0 (本版:0)空间积分:0推广积分:0来自:广东省中山市状态:...离线...[个人空间][短信][博客][推广获积分] [报告]25楼发表于 2005-12-26 14:17 要总结消化才行啊。我这里每次测试的 ">;"都是提示错误如下:[Copy to clipboard] [ - ]CODE:[root@PostFix shell]# [ d>;c ]&&echo ok||echo fail[root@PostFix shell]#-bash: syntax error near unexpected token `;'然后用了转义"\"同样的出现错误[Copy to clipboard] [ - ]CODE:[root@PostFix shell]# [ d\>;c ]&&echo ok||echo failbash: [: missing `]'-bash: c: command not foundfail而直接用 "\"+">"即 "\>"就可以实现了哦。[Copy to clipboard] [ - ]CODE:[root@PostFix shell]# [ d\>c ]&&echo ok||echo failok这样反而OK,我是在redhat as3下面的bash环境下测试的。为何和你们所说的不一样呢?您对本贴的看法:鲜花[0]臭蛋[0]__________________________________达芙妮新店开张http://store.taobao.com/shop/view_shop.htm?asker=wangwang&shop_nick=tanjing_shop[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 寂寞烈火 老法王 CU编号:187152注册:2004-10-1最后登录:2009-05-27帖子:24524精华:5可用积分:17435(大富大贵)信誉积分:110专家积分:171 (本版:102)空间积分:1425推广积分:0来自:北京海淀状态:...离线...[个人空间][短信][博客][推广获积分] [报告]26楼发表于 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 ... []对于逻辑判断,要远远不如用[[]],因此推加使用[[]]您对本贴的看法:鲜花[0]臭蛋[0]__________________________________Window$ XP Professional service pack 2CYGWIN_NT-5.1 + GNU bash version 3.2.39[有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]27楼发表于 2005-12-26 15:49 QUOTE:原帖由 佛光普照 于 2005-12-26 14:17 发表要总结消化才行啊。我这里每次测试的 ">;"都是提示错误如下: ... 呵呵,这个难怪你搞糊涂了。原贴中的">"后面并没有“;”,可能是论坛系统升级后系统在后台作转换时有点bug吧。这个有点shell常识的应该看得出来,不过初学者就难免莫名其妙了。这一点还请大家阅读时注意。这个应该烦请版主示下:到底应该怎样消除这个错误?最好是修改程序,免得跟帖的每个人都重新修改。有的网友可能已经很久不来了。我还是先修改一下自己的帖子吧。对大家造成的误导和困扰,对不起了!我的三个帖子,原样贴在下面,请参考。不便之处,请大家原谅!shaoping兄或其他人的帖子,最好还是请本人修改。[ 本帖最后由 woodie 于 2005-12-26 16:28 编辑 ]您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]28楼发表于 2005-12-26 16:17 16楼的克隆:###请大家注意:#可能是论坛系统升级后系统在后台作转换时有点bug吧。本人的帖子中的“>”后奇怪的多了以各分号“;”,造成有的网友阅读时的混淆和困扰。详见25楼佛光普照兄的帖子。在此woodie跟大家saysorry了!我把自己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。[Copy to clipboard] [ - ]CODE:$ type testtest 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),下同):[Copy to clipboard] [ - ]CODE:$ [ 2 -lt 10 ]&&echo true&&echo falsetrue$ [ 2 -gt 10 ]&&echo true||echo falsefalse$ [ 2 \false$ [ 2 \> 10 ]&&echo true||echo false #you should use "\>"true[Copy to clipboard] [ - ]CODE:$ [[ 2 -gt 10 ]]&&echo true||echo falsefalse$ [[ 2 -lt 10 ]]&&echo true||echo falsetrue$ [[ 2false$ [[ 2 > 10 ]]&&echo true||echo falsetrue[Copy to clipboard] [ - ]CODE:$ [ test = test ]&&echo true||echo false #normal comparetrue$ [ 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 heretrue$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the patternfalse[Copy to clipboard] [ - ]CODE:$ [[ test = test ]]&&echo true||echo false #normal comparetrue$ [[ 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 heretrue$ [[ test = "t??t" ]]&&echo true||echo false #alert: don't quote the patternfalse说明:"-gt", "-lt"是算术比较操作符,用于比较整数的大小。">", "另外,"="还可以做简单的模式匹配,与一般的正则表达式不同,这里的模式匹配要简单得多,类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起。第2点是谈相同点,以下的都是二者"行为上"的不同点。3. [[的行为相对地更接近于其他语言,例如"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或"。例如:[Copy to clipboard] [ - ]CODE:$ [[ 1 a ]]&&echo true||echo falsetrue$ [[ 1 a ]]&&echo true||echo falsebash: syntax error in conditional expressionbash: syntax error near `-a'$ [ 1 a ]&&echo true||echo falsetrue$ [ 1 a ]&&echo true||echo false #wrong syntaxbash: [: missing `]'false$ [ 1 a ]&&echo true||echo false #aslo wrongbash: [: &&: binary operator expectedfalse4. [ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与""不需转义;由于"[["是关键字,不会做命令行扩展,因而相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做。举例:[Copy to clipboard] [ - ]CODE:$ [ "-z" "" ]&&echo true||echo falsetrue$ [ -z "" ]&&echo true||echo falsetrue$ [[ "-z" "" ]]&&echo true||echo falsebash: conditional binary operator expectedbash: syntax error near `""'$ [[ -z "" ]]&&echo true||echo falsetrue5. [[ ... ]]进行算术扩展,而[ ... ]不做。举例:[Copy to clipboard] [ - ]CODE:$ [[ 99+1 -eq 100 ]]&&echo true||echo falsetrue$ [ 99+1 -eq 100 ]&&echo true||echo falsebash: [: 99+1: integer expression expectedfalse$ [ $((99+1)) -eq 100 ]&&echo true||echo falsetrue您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]29楼发表于 2005-12-26 16:21 19楼的克隆:shaoping0330的钻研精神让人佩服。我再补充几点:1.((...))等价于let,专门用来进行算术运算、比较,bsh中也可以使用,而且最妙的是它支持C风格的运算符。要取得算术表达式的值时可以用"$((expression))"形式举例:[Copy to clipboard] [ - ]CODE:$ ((i=1+99)) ; echo $i100$ echo $((i++))101$ echo $((--i))100$ echo $((2**3))8$ echo $((5%3))2$ echo $((1102.test等价于[],与[[]]相似但有些区别;既可用于算术运算、比较又可用于字符串、文件测试。算术比较用 -eq, -lt, -gt, -le,-ge,字符串比较用, =, !=, >=和3.正如我在以前的帖子中指出的,可以把[...]看作一个shell命令,方括号中的内容就是命令行参数。所以""并不是不可以用在[...]中,只不过他们是shell的"元字符",使用前必须用"\"转义,去掉其特殊含义就可以了。4.关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A",就表示是字符串比较,那么9 >100为真,因为这实际上等价于‘9’ >‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。至于不要使用""的意见,我不能苟同。:)5.((...))的结构对于算术运算应该大力提倡,这一点我非常赞成。6.shaoping说[[在bash与ksh中不同,是指什么?请指教。我对ksh不是很熟。:-(您对本贴的看法:鲜花[0]臭蛋[0][有奖讨论]新服务器8个月能不能收回成本 |IBM System x嘉年华惊喜多多 | 联想特惠本 IT168专享抢购 woodie 大天使 CU编号:51293注册:2003-4-10最后登录:2009-05-22帖子:1703精华:4可用积分:1904(家境小康)信誉积分:100专家积分:28 (本版:8)空间积分:0推广积分:0来自:西安状态:...离线...[个人空间][短信][博客][推广获积分] [报告]30楼发表于 2005-12-26 16:24 22楼的克隆:>相比较而言,使用 [[ ]] 比使用 [ ] 更可靠,建议多多使用。我的意见两者都是可靠的,尽可以大胆使用。实际上[]的兼容性更好些,因为在bsh这样古老的shell中也能使用;[[]]则只能用于ksh及其后继者bash、zsh中。>不过woodie兄台所提到的第 4 点 是有些遗漏的,在 [ ]中若直接使用 >看来shaoping兄还是没搞清楚,大概是我前面都没写清楚吧。:)""可以直接用在[[]]中。但不可以直接用在[]中,只能加"\"转义后或者用引号括起后使用,否则shell就会把它解释为输入输出改向符。看例子:[Copy to clipboard] [ - ]CODE:$ ls 200?ls: 200?: No such file or directory$ [ 2004bash: 2005: No such file or directory$ echo $?1$ [ 2004 > 2005 ]$ echo $?0$ ls 200?2005首先列一下目录,保证没有200?字样的文件存在。然后执行[ 2004执行[ 2004 > 2005 ],系统正常执行了命令。再列下目录,已经生成了文件2005!再看:[Copy to clipboard] [ - ]CODE:$ [ 2004 "true$ [ 2004 '>' 2006 ]&&echo true||echo falsefalse$ [ 2004 \> 2006 ]&&echo true||echo falsefalse看到了吧,去掉了特殊含义的""就表现得规规矩矩的了。:)