多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],bash 的内部命令,[和test是等同的。双中括号[[ ]],[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。
[ ] 和 [[]]区别
[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。
[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
实例
上面说了这么多概念性的区别,不能清晰描述 [ ] 与 [[ ]] 的区别,不如我们先来看一些应用场景,根据应用场景,反而更容易理解一些。
(这里一定要注意空格的问题,空格不可或缺)
在[[ ]]中使用< 和 >符号时,系统进行的排序操作,而且支持在测试表达式内使用&&和||符号。在test和[ ]测试语句中不可以使用&& 、||符号。
在ASCll码的顺序中,小写字母顺序码 > 大写字母顺序码 > 数字顺序码。在使用ASCll中,可以使用LANG=C设置在排序时使用标准的ASCll码顺序。
验证了,小写字母顺序码大于大写字母顺序码。
验证了,大写字母顺序码大于数字顺序码。
上面的截屏,大写字母顺序码不能大于小写字母顺序码。
虽然[ ]支持同时进行时多个条件的逻辑测试,但是在[ ]中需要使用-a 和 -o进行逻辑与和逻辑或的比较操作,而[[ ]]中可以直接使用&&和||进行逻辑比较操作,更直观,可读性更好。
需要注意的还有 ==
比较符,在 [[]]中==
是模式匹配,模式匹配允许使用通配符,例如:Bash常用的通配符有*、?、[…]等,而 ==
在test语句中仅代表字符串的精准比较,判断字符串是否一模一样。
我们可以写个例子,测试变量name的值是否已字母J开头,后面可以是任意长度字符,测试结果为真。
接着,测试变量name的值是否以字母A开头,后面可以是任意长度的任意字符,测试结果为假。
测试变量name的值是否m和nger中间有任意的单子字符?
我们下面测试字符a,是否是小写字母?
测试字符a,是否是数字?
下面使用[ ]对 == 进行比较操作,但在[]中系统进行的是字符串的比较操作,判断两个字符串是否绝对相同。
另外,在[[]]中还支持使用=~进行正则匹配,而在[]中则完全不支持正则匹配。
上面的截屏,对变量name的值进行正则匹配,判断name的值是否包含字母w。
下面我们判断name的值是否包含数字。
对name的值是否包含小写字母。
最后,我们列出[[]] 和 [] 的差异汇总信息,相同点这里不再赘述。为了熟练掌握这些语法。
[[]]测试 | []测试 |
---|---|
< 排序比较 | 不支持 |
> 排序比较 | 不支持 |
&& 逻辑与 | -a 逻辑与 |
== 模式匹配 | ==字符匹配 |
=~正则匹配 | 不支持 |
欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下: