如果直接描述 [ ] 与 [[ ]] 的区别,反而不太容易理解,不如先来看一些应用场景,根据应用场景,反而更容易理解。

场景一:判断变量是否为空

我们可以直接判断变量是否为空,方法如下

如上图所示,变量值非空时返回真(即返回值为0),使用上述方法判断变量值是否为空时,[ ] 与 [[ ]] 没有区别,上例中,变量值非空,返回真,我们可以使用”!”进行取反,使得变量值为空时,返回真,示例如下

如上图所示,变量c是一个没有被声明赋值的变量,其值为空,我们可以使用上述语法,判断变量c的值是否为空,变量值为空,返回真,同理,上述示例中,[ ] 与 [[ ]] 没有区别。

那么在判断变量是否为空时,[ ] 与 [[ ]] 的区别在哪里呢?不要着急,我们慢慢聊。

我们知道,在Linux中,我们可以使用test命令判断一个字符串是否为空,test命令为我们提供了”-z选项”与”-n选项”,使用这两个选项可以判断字符串是否为空。

“-z选项”可以判断指定的字符串是否为空,为空则返回真,非空则返回假,-z可以理解为zero

“-n选项”可以判断指定的字符串是否为空,非空则返回真,为空则返回假,-n可以理解为nozero

示例如下

正如上图所示,我们通过test命令判断了字符串是否为空,那么我们来尝试一下,使用test命令判断变量的值是否为空,示例如下

上例中,变量b的值为空,按照正常的逻辑来说,使用test -n 命令判断变量b的值是否为空时,应该返回假,因为test命令的-n选项表示指定的字符串非空时,返回真,为空时,返回假,但是上例中,’test -n $b’ 这条命令的返回值却为真(应该为假),这是明显不正确的,所以,为了防止上述情况的发生,在使用test命令的-n选项判断变量的值是否为空时,需要在变量的外侧加上”双引号”,示例如下

好了,我们已经明白了使用test命令判断变量是否为空时的一些注意点,那么话说回来,这篇文章的主题是介绍[ ]与[[ ]]的区别的,为什么我们要先介绍test命令呢?其实,在Linux中,”[ ]”与”test命令”是等效的,比如,我们也可以使用”-n”或者”-z”结合”[ ]”去判断变量是否为空

根据上例中的结果可以看出,当”[ ]”中使用”-n”或者”-z”这些选项判断变量是否为空时,必须在变量的外侧加上双引号,才更加保险,与”test命令”的使用方法相同。

不过,使用”[[ ]]”时则不用考虑这样的问题,示例如下

综上所述,我们可以得出如下结论:

当使用”-n”或者”-z”这种方式判断变量是否为空时,”[ ]”与”[[  ]]”是有区别的。

使用”[ ]”时需要在变量的外侧加上双引号,与test命令的用法完全相同,使用”[[  ]]”时则不用。

场景二:组合判断条件

在使用shell脚本时,判断几乎是必不可少的,而很多时候,如果想要得到最终的判断结果,可能需要同时对多个条件进行判断,比如,条件一与条件二必须同时为真,结果才为真,再比如,条件一或条件二只要有一个为真,结果即为真。没错,这时,多个条件之间存在”与”或者”或”的关系。

在shell中,我们可以使用”-a”或者”-o”对多个条件进行连接,然后进行”与运算”或者”或运算”,也可以使用”&&”或者”||”对多个条件进行连接,但是,这两种方法对于”[ ]”或者”[[  ]]”来说,是存在区别的,我们通过一些小例子来了解一下这些区别。

简单示例如下

如上图所示,当使用”[[ ]]”对多个条件进行”与运算”或者”或运算”时,可以一次性将多个条件都包含在一个”[[  ]]”中,然后将每个条件用”&&”或者用”||”连接起来,或者每个条件分别包含在一个”[[  ]]”中,然后再用”&&”或者用”||”连接起来,正如上图所示,这两种写法都是没有问题的。

那么,使用”[[  ]]”时,能否使用”-a”或者”-o”对多个条件进行连接呢?我们来实验一下,示例如下

看来,使用”[[  ]]”时,是不能使用”-a”或者”-o”对多个条件进行连接的。

仍然使用上述套路,我们将”[[  ]]”换成”[  ]”试试。

看来,当使用”[  ]”时,如果使用”-a”或者”-o”对多个条件进行连接,”-a”或者”-o”必须被包含在”[ ]”之内,才能够正常使用,否则会报语法错误。

“-a”或者”-o”的使用方法我们已经在”[  ]”中进行了验证,现在,我们来试试”&&”或者”||”在”[  ]”中的使用方法,示例如下

从上例中可以看出,与”-a”或者”-o”的使用方法正好相反,当使用”[  ]”时,如果使用”&&”或者”||”对多个条件进行连接,”&&”或者”||”必须在”[ ]”之外,否则会报语法错误。

综上所述,我们可以总结出如下结论:

在使用”[[  ]]”时,不能使用”-a”或者”-o”对多个条件进行连接。

在使用”[  ]”时,如果使用”-a”或者”-o”对多个条件进行连接,”-a”或者”-o”必须被包含在”[ ]”之内。

在使用”[  ]”时,如果使用”&&”或者”||”对多个条件进行连接,”&&”或者”||”必须在”[ ]”之外。

场景三:某些运算符

如果想要判断变量的值是否满足某个正则表达式,我们可以使用符号”=~”进行判断,示例如下:

如上图所示,我们通过”=~”,可以判断一个变量的值是否匹配对应的正则表达式,但是细心如你一定发现了,上例中使用了”[[  ]]”,如果把”[[  ]]”替换成”[  ]”,能否同样正常运转呢?我们来试试。

看来是不能这样使用的,所以我们可以得出结论,”=~”只能应用于”[[  ]]”中,不能应用于”[  ]”中。

同样,有些其他符号对于”[[  ]]”或者”[  ]”来说,在使用时也是有区别的,比如”>”或者”<”,在之前的文章中,其实已经描述了在使用”>”或者”<”时,”[[  ]]”与”[  ]”的区别,如果你想要了解这些知识点,可以参考如下连接

‘的区别”>shell中’-gt’与’>’的区别

小结

当使用”-n”或者”-z”这种方式判断变量是否为空时,”[ ]”与”[[  ]]”是有区别的。

使用”[ ]”时需要在变量的外侧加上双引号,与test命令的用法完全相同,使用”[[  ]]”时则不用。

在使用”[[  ]]”时,不能使用”-a”或者”-o”对多个条件进行连接。

在使用”[  ]”时,如果使用”-a”或者”-o”对多个条件进行连接,”-a”或者”-o”必须被包含在”[ ]”之内。

在使用”[  ]”时,如果使用”&&”或者”||”对多个条件进行连接,”&&”或者”||”必须在”[ ]”之外。

在使用符号”=~”去匹配正则表达式时,只能使用”[[  ]]”,当使用”>”或者”<”判断字符串的ASCII值大小时,如果结合”[ ]”使用,则必须对”>”或者”<”进行转义。

以上就是我个人总结的一些注意点与使用方法,但是并不一定全面,如果你也有一些其他的使用心得,可以分享出来,我也可以查漏补缺。

上述注意点虽然很细微,但是在不了解这些问题的时候,其实还是比较坑爹的,希望上述总结能够帮助到你~~~

[] 与 [[ ]]相关推荐

  1. 《自控力》与《学习之道》

    两本书同时阅读,讲的东西都是关于人的精神,意志等,非常推荐阅读. overview <自控力>这本书适用面更广,如果你之前并没有关注过精神方面的东西,也立刻可以吸收到很多知识,并可以投入到 ...

  2. 关于如何发挥最好的学习状态的思考暨《自控力》一书读后感

    *关于如何发挥最好的学习状态的思考暨<自控力>一书读后感 个人所理解的成就公式是: success = motivation + method + state 这三者缺一不可,于是今天借 ...

  3. 自控力差不是病,你只是不知怎么与自己相处罢

    不错,从心理学角度进行了剖析,对自我管理和成长有参考意义! 转自:http://36kr.com/p/5086988.html 计划业余时间学些有用的知识.治疗拖延症.戒烟戒暴饮暴食.培养兴趣爱好.坚 ...

  4. 清华教授转述:读博6年未毕业被认定为自控力不够,或将影响个人贷款额度

    全世界只有3.14 % 的人关注了 爆炸吧知识 图片来源:网络 来源:募格课堂.微博@人文清华.中国教育报.学位与写作 据清华大学"人文清华"讲坛官方微博@人文清华发布,清华大学公 ...

  5. 知乎高赞:自控力极差的人如何自救?

    Incremental change is better than ambitious failure.(逐步的改善好过雄心勃勃的失败.) 作者 | 知乎@秋霜色 很多人觉得自己计划完不成,拖延,生活 ...

  6. 2015第16周四自控力

    <自控力>中介绍的个人提升方法: 平时的修炼 1.专心呼吸是一种简单有效的冥想技巧.在椅子上安静坐好,闭上眼睛,在呼吸的同时在心中默念.几分钟后就可以不再默念了.当你发现自己有点走神的时候 ...

  7. 《自控力》读后感——意志力与认识自己

    前言 最近看完了<自控力>这本书,感觉书中很多观点觉得很赞同.同时也通过此书对意志力以及人的本能有了更多的认识.以前经常遇到因为完不成早上写得计划而放纵,甚至自卑,气馁,同时工作之后也经常 ...

  8. 写给自己过去的一封信:成功=好习惯+自控力

    好习惯是成功的基础,自控力是成功的翅膀:养成好习惯就不会失败,学会自控等于锦上添花! 正面好习惯例子:高考的时候为什么么我们能夜以继日的学习?每天学的很晚第二天起得很早,然后睡得很晚,第二天仍然迷迷糊 ...

  9. 《自控力》分享一些减缓压力小妙招

    其实男孩子每个月也总有那么几天--有些烦躁,这不,最近上班感觉效率非常低,尤其到了周五的时候,这种情况异常的强烈.工作学习的意志力明显下降.所以读了读自控力--凯利.麦格尼格尔这本书,并把里面的方法分 ...

  10. 自控力如何改善了我的生活

    我是在暑假看到<自控力>这本书,当时还没有"自控力正是我需要"的概念,只是对科普式的心理书籍比较感兴趣,便买了一本带回了家.在家中只是粗略翻了翻,读了前两章(当时主要是 ...

最新文章

  1. Merge Sorted Array
  2. Python中使用ncmbot玩转网易云音乐
  3. SEO算法:如何通过PageRank算法判断SEO排序结果
  4. 综艺节目php灭灯_非诚勿扰php程序员 结果遭女嘉宾瞬间全灭灯
  5. RMQ问题,加深对ST算法的理解(Sparse Table)
  6. 偷窃转基因玉米种子引发中美打农业官司
  7. java 单例设计_Java 之单例设计模式
  8. GitHub+Hexo搭建自己的Blog之-本地环境部署01
  9. 【网友投稿】大家都在谈裁员,我却默默干倒了3家公司!
  10. 【渝粤教育】国家开放大学2018年春季 8616-22T食品营养卫生 参考试题
  11. mac安装linux 键盘不能用了,Parallels Desktop 9在Mac虚拟机安装Linux Ubuntu系统
  12. 天联服务器虚拟网卡未启动,天联未检测到虚拟网卡
  13. SSL证书中的128位加密和256位加密有何区别?
  14. 测绘专业计算机知识,测绘科学技术的发展趋势
  15. Zabbix设置主动模式与被动模式
  16. Java中的Math函数常用方法都在这里
  17. 独立游戏开发日志:2021年2月14日 斜面攀爬
  18. python对字符串进行加密_python学习:实现将字符串进行加密
  19. 打造最美HTML5 3D机房 —— 第二季重磅回归
  20. PHP日期时间函数之strtotime()

热门文章

  1. C++找出二维数组中的鞍点
  2. 算法 图2 Saving James Bond - Easy Version
  3. checkra1n越狱工具下载地址
  4. 微软office在线使用,web时代真的来临了
  5. 滴滴下架140天,出行的战争远未结束!
  6. R语言 循环读取数据文件 循环读取csv tsv xlsx数据
  7. EM算法推导以及在高斯混合模型中的应用(详细)
  8. 用Java玩转Excel,竟然如此easy~
  9. 【Java】实现记事本(完整版)
  10. c语言乘法运算 相对于,C语言中,求余运算与乘除法运算,哪个的优先级高