首页 > 代码库 > Shell 编程基础之 [ 与 [[ 的异同
Shell 编程基础之 [ 与 [[ 的异同
一、简介
[ 与 test 等价,是 bash 的内部命令,GNU/linux 系统的 coreutils 软件包通常带 /usr/bin/test 和 /usr/bin/[ 命令。如果我们不用绝对路径指 明,通常我们用的都是bash 自带的命令。
[[ 是 bash 关键字(据说从2.02起引入对[[的支持)
二、异同分析
相同点
- 都支持算术比较 ("gt"、"ge"、"eq"、"ne"、"lt"、"le")
user@ae01:~$ [ 2 -lt 10 ]&&echo true||echo falsetrue
user@ae01:~$ [ 2 -gt 10 ]&&echo true||echo falsefalse
user@ae01:~$ [[ 2 -lt 10 ]]&&echo true||echo falsetrue
user@ae01:~$ [[ 2 -gt 10 ]]&&echo true||echo falsefalse
- 都支持字符串比较("<"、">" 但具体使用有些不同)
关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A<B,A<a, 1<2。再强调一次,这里只要用了"<"、">",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。user@ae01:~$ [ 2 \< 10 ]&&echo true||echo falsefalse
user@ae01:~$ [ 2 \> 10 ]&&echo true||echo falsetrue
注意转义字符\的使用,否则bash会认为是标准输出重定向。
user@ae01:~$ [[ 2 < 10 ]]&&echo true||echo falsetrue
user@ae01:~$ [[ 2 > 10 ]]&&echo true||echo falsefalse
- 都支持简单模式的匹配
user@ae01:~$ [ test = test ]&&echo true||echo falsetrue
user@ae01:~$ [ test = t*t ]&&echo true||echo falsetrue
user@ae01:~$ [ test = t..t ]&&echo true||echo falsefalse
user@ae01:~$ [ test = t??t ]&&echo true||echo falsetrue
user@ae01:~$ [[ test = test ]]&&echo true||echo falsetrue
user@ae01:~$ [[ test = t*t ]]&&echo true||echo falsetrue
user@ae01:~$ [[ test = t..t ]]&&echo true||echo falsefalse
user@ae01:~$ [[ test = t??t ]]&&echo true||echo falsetrue
模式匹配类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起,使用引用关闭了某些元字符的特殊功能。
不同点
- 逻辑与和逻辑或
- [ 逻辑与:-a;逻辑或:-a]
[ 1 -lt 2 ]:true; [ b > a ]:trueuser@ae01:~$ [ 1 -lt 2 -a b > a ]&&echo true||echo falsetrue
user@ae01:~$ [ 1 -gt 2 -a b > a ]&&echo true||echo falsefalse
user@ae01:~$ [ 1 -gt 2 -o b > a ]&&echo true||echo falsetrue
- [[ 逻辑与:&&;逻辑或:|| ]]
[ 1 -lt 2 ]:true; [ b > a ]:trueuser@ae01:~$ [[ 1 -lt 2 && b > a ]]&&echo true||echo falsetrue
user@ae01:~$ [[ 1 -gt 2 && b > a ]]&&echo true||echo falsefalse
user@ae01:~$ [[ 1 -gt 2 || b > a ]]&&echo true||echo falsetrue
- [ 逻辑与:-a;逻辑或:-a]
- 命令行参数
"[["是关键字,不会做命令行扩展,所以在[[中"<"与">"不需转义,但是相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做user@ae01:~$ [ "-z" "" ]&&echo true||echo falsetrue
user@ae01:~$ [[ "-z" "" ]]&&echo true||echo false-bash: conditional binary operator expected-bash: syntax error near `""‘
- 算术扩展
[[ ... ]]进行算术扩展,而[ ... ]不行,[ ... ]需要使用$(())user@ae01:~$ [ 99+1 -eq 100 ]&&echo true||echo false-bash: [: 99+1: integer expression expectedfalse
user@ae01:~$ [ $((99+1)) -eq 100 ]&&echo true||echo falsetrue
user@ae01:~$ [[ 99+1 -eq 100 ]]&&echo true||echo falsetrue
Shell 编程基础之 [ 与 [[ 的异同
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。