快速业务通道

shell内置命令test单双括号的区别

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-27

以上是摘自《UNIX SHELL范例精通》 而这个短文是我以这张图片文字的理解. 之前我一直想不明白单括号的TEST命令和双引号的TEST命令之间有什么区别? 对变量进行单词分离是什么意思呀? 对元字符进行模式匹配? 在双括号的TEST命令中,字符串加双引号与否有什么区别呀? 1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离. 以下情况分为变量为单个单词,含有空格的词组. [root@www yansan]# echo $name hello [root@www yansan]# [ $name = "hello" ] [root@www yansan]# echo $? 0 [root@www yansan]# [[ $name = "hello" ]] [root@www yansan]# echo $? 0 [root@www yansan]# 得出结论,变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了. [root@www yansan]# echo $name1 hello world [root@www yansan]# [ $name1 = "hello world" ] -bash: [: too many arguments [root@www yansan]# echo $? 2 [root@www yansan]# [ "$name1" = "hello world" ] [root@www yansan]# echo $? 0 [root@www yansan]# [[ $name1 = "hello world" ]] [root@www yansan]# echo $? 0 [root@www yansan]# 这次变量是一个词组了,带空格那种了.当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了 [ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了.因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就给变量加个双引号了,这时它就不会发生错误了.而在下面的双括号的TEST命令中,即使变量含有空格又何妨,它不能对变量单词进行分离嘛. 2.单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上.这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值. [root@www yansan]# ll abc -rw-r--r-- 1 root root 0 Sep 24 08:59 abc [root@www yansan]# test -r abc ; echo $? 0 [root@www yansan]# [ -r abc ] ; echo $? 0 [root@www yansan]# 3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了. [root@www yansan]# name=tom [root@www yansan]# [ $name = t?? ] [root@www yansan]# echo $? 1 [root@www yansan]# [[ $name = t?? ]] [root@www yansan]# echo $? 0 [root@www yansan]# 4.在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也用引号括起来. 我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展.如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理. [root@www yansan]# echo $name tom [root@www yansan]# echo $name1 tomm [root@www yansan]# [[ $name = tom ]] [root@www yansan]# echo $? 0 [root@www yansan]# [[ $name = tom? ]] [root@www yansan]# echo $? 1 [root@www yansan]# [[ $name1 = tom ]] [root@www yansan]# echo $? 1 [root@www yansan]# [[ $name1 = tom? ]] [root@www yansan]# echo $? 0

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号