探索shell中[ ]和[[]]的区别

多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],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),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值