设为首页 收藏本站
查看: 1007|回复: 0

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

[复制链接]

尚未签到

发表于 2018-8-28 13:05:03 | 显示全部楼层 |阅读模式
  1、单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。
  以下情况分为变量为单个单词,含有空格的词组。
  [root@www yujia]# echo $name
  hello
  [root@www yujia]# [ $name = "hello" ]
  [root@www yujia]# echo $?
  0
  [root@www yujia]# [[ $name = "hello" ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]#
  得出结论,因为变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了。
  [root@www yujia]# echo $name1
  hello world
  [root@www yujia]# [ $name1 = "hello world" ]
  -bash: [: too many arguments
  [root@www yujia]# echo $?
  2
  [root@www yujia]# [ "$name1" = "hello world" ]
  [root@www yujia]# echo $?
  0
  [root@www yujia]# [[ $name1 = "hello world" ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]#
  这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了
  [ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离嘛。
  2、单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。
  [root@www yujia]# ll abc
  -rw-r--r-- 1 root root 0 Sep 24 08:59 abc
  [root@www yujia]# test -r abc ; echo $?
  0
  [root@www yujia]# [ -r abc ] ; echo $?
  0
  [root@www yujia]#
  3、单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。
  [root@www yujia]# name=tom
  [root@www yujia]# [ $name = t?? ]
  [root@www yujia]# echo $?
  1
  [root@www yujia]# [[ $name = t?? ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]#
  4、在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。
  我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。
  [root@www yujia]# echo $name
  tom
  [root@www yujia]# echo $name1
  tomm
  [root@www yujia]# [[ $name = tom ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]# [[ $name = tom? ]]
  [root@www yujia]# echo $?
  1
  [root@www yujia]# [[ $name1 = tom ]]
  [root@www yujia]# echo $?
  1
  [root@www yujia]# [[ $name1 = tom? ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]#
  [root@www yujia]# [[ $name = "tom" ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]# [[ $name = "tom?" ]]
  [root@www yujia]# echo $?
  1
  [root@www yujia]# [[ $name1 = "tom" ]]
  [root@www yujia]# echo $?
  1
  [root@www yujia]# [[ $name1 = "tom?" ]]
  [root@www yujia]# echo $?
  1
  5、[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。
  [root@www yujia]# ll mm
  -r--r--r-- 2 root root 644 Sep 24 08:48 mm
  [root@www yujia]# [ -r mm -a -x mm ]
  [root@www yujia]# echo $?
  1
  [root@www yujia]#
  [[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与或非使用(&& || !)的形式了。
  [root@www yujia]# echo $name
  tom
  [root@www yujia]# [[ $name = [tT]om && $name = t?? ]]
  [root@www yujia]# echo $?
  0
  [root@www yujia]#


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557769-1-1.html 上篇帖子: 使用shell脚本搭建源码LAMP环境 下篇帖子: Linux Shell编程基本知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表