0
点赞
收藏
分享

微信扫一扫

shell中[ ]与[[ ]]的区别


文章目录

  • ​​区别一​​
  • ​​区别二:<和>在[[ ]]中用作排序,而[ ]不支持​​
  • ​​区别三:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示​​
  • ​​区别四:在[ ]中==是字符匹配,在[[ ]]中是模式匹配​​
  • ​​区别五:[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配​​
  • ​​区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持​​
  • ​​区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要​​
  • ​​遇到的坑​​
  • ​​`1、[[ ! -f hosts ]]条件判断导致脚本退出`​​
  • ​​原因​​
  • ​​解决​​


区别一

[ ]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有的Shell解释器中

[[ ]]仅可运行在特定的几个Shell解释器中(如Bash等)

区别二:<和>在[[ ]]中用作排序,而[ ]不支持

进行比较前先设置LANG=C,在排序时使用ASCII码顺序

数字的ASCII码应该小于大写字母,使用[[ ]]的结果是正确的
shell中[ ]与[[ ]]的区别_shell

区别三:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示

[[ ]]不支持-a
shell中[ ]与[[ ]]的区别_模式匹配_02

区别四:在[ ]中==是字符匹配,在[[ ]]中是模式匹配

[[ ]]中表示变量name是否以字母d开头
shell中[ ]与[[ ]]的区别_shell_03

区别五:[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配

[[ ]]判断变量name的值是否包含字母c
shell中[ ]与[[ ]]的区别_shell_04

区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持

[ 1 == 1 -a (2 == 2 -o 3 == 4) ] && echo Y || echo N
[[ 1 == 1 && (2 == 2 || 3 == 4) ]] && echo Y || echo N #[[]]不支持-a和-o

shell中[ ]与[[ ]]的区别_正则匹配_05

区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要

shell中[ ]与[[ ]]的区别_模式匹配_06

参考书籍:《Linux Shell核心编程指南》

遇到的坑

​1、[[ ! -f hosts ]]条件判断导致脚本退出​

[[ ! -f hosts ]] && echo "ERROR:hosts Not Found" && exit 1
echo $?
1

原因

如果hosts文件存在,那么[[ ! -f hosts ]]的状态码则为1,如果脚本开启了set -e,那边会导致脚本退出

解决

如果环境监测正常,在后面用echo输出一句话即可

[[ ! -f hosts ]] && echo "ERROR:hosts Not Found" && exit 1
echo "INFO:Check_Env Is Ok"


举报

相关推荐

0 条评论