Shell 中 [[]]和[]的区别

多数情况下 [][[]]是可以通用的,两者的主要差异是: test[]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有Shell解释器中,相比较而言 [[]]仅可运行在特定的几个Shell解释器中(如Bash、Zsh等)。然而,目前支持使用 [[]]进行条件测试的解释器已经足够多了。使用 [[]]进行测试判断时甚至可以使用正则表达式。

主要差别:

1. 虽然 [] 也支持同时进行多个条件的逻辑测试,但是在 [] 中需要使用-a和-o进行逻辑与和逻辑或的比较操作,而 [[]] 中可以直接使用&&和||进行逻辑比较操作,更直观,可读性更好。

比如:

[[ A && B ]]或者 [ A -a B ],意思是仅当A和B两个条件测试都成功时,整体测试结果才为真。

[[ A || B ]]或者 [ A -o B ],意思是只要A或B中的任意一个条件测试成功,则整体测试结果为真。

让我们做几个案例来测试一下:

[En]

Let’s do a few cases to test:

[root@centos7~]# [ yes == yes -a no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == y -a no == no ] && echo Y || echo N
N
[root@centos7~]# [ yes == y -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == yes -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [[ yes == yes && no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y && no == no ]] && echo Y || echo N
N
[root@centos7~]# [[ yes == yes || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ A == A && 6 -eq 6 && C == C ]]
[root@centos7~]# echo $?                               #返回0表示正确0
[root@centos7~]# [[ A == A && 6 -eq 3 && C == C ]]
[root@centos7~]# echo $?                               #返回非0表示错误1

2. 需要注意的还有==比较符,在 [[]] 中==是模式匹配,模式匹配允许使用通配符。例如,Bash常用的通配符有*、? 、[…]等。而==在test语句中仅代表字符串的精确比较,判断字符串是否一模一样

[root@centos7~]# name=Xiao
[root@centos7~]# [[ $name == X* ]] && echo Y || echo N
Y
[root@centos7~]# [[ a == [a-z] ]] && echo Y || echo N
Y
[root@centos7~]# [ $name == X? ] && echo Y || echo N
N
[root@centos7~]# [ $name == X* ] && echo Y || echo N
N
[root@centos7~]# name='X*'
[root@centos7~]# [ $name == 'X*' ] && echo Y || echo N
Y
[root@centos7~]# [[ a == a ]] && echo Y || echo N
Y
[root@centos7~]# [ a == b ] && echo Y || echo N
N

3.在 [[]] 中还支持使用=~进行正则匹配,而在 [] 中则完全不支持正则匹配

[root@centos7~]# name="welcome to beijing"
[root@centos7~]# [[ $name =~ w ]] && echo Y || echo N
Y
[root@centos7~]# [[ $name =~ [a-z] ]] && echo Y || echo N
Y

总结:

下表列出了[[]]和[]的差异汇总信息,相同点就不再赘述了

Shell 中 [[]]和[]的区别

Original: https://www.cnblogs.com/xiong97/p/16625974.html
Author: 静言善思
Title: Shell 中 [[]]和[]的区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/522813/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球