Shell test 单中括号[] 双中括号[[]] 的区别

在写Shell脚本的时候,经常在写条件判断语句时不知道该用[] 还是 [[]],首先我们来看他们的类别:


$type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin

[ test 是 Shell 的内部命令,而[[是Shell的关键字。


$test -f settings.py && echo True
True $[ -f settings.py ] && echo True
True

[ test 是相等的。


$[ 2 < 1 ] && echo True || echo False
True $[[ 2 < 1 ]] && echo True || echo False
False

既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。


x=1
y=1 $[ $x == 1 && $y == 1 ] && echo True || echo False
-bash: [: missing `]'
False $[[ $x == 1 && $y == 1 ]] && echo True || echo False
True $[ $x == 1 -a $y == 1 ] && echo True || echo False
True

[[中使用&&||表示逻辑与和逻辑或。[ 中使用 -a -o 表示逻辑与和逻辑或。


$[[ 'abcd' == a*d ]] && echo True || echo False
True $[ 'abcd' == a*d ] && echo True || echo False
False

[[支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

总结:

使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,

但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。


$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False $[[ !(pip list | grep pip) ]] && echo True || echo False
True

参考

http://blog.csdn.net/taiyang1987912/article/details/39551385
http://blog.csdn.net/yongan1006/article/details/7195303

Shell 中test 单中括号[] 双中括号[[]] 的区别的更多相关文章

  1. python中,花括号,中括号,小括号的区别

    python中,花括号,中括号,小括号的区别 Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list ...

  2. 转一篇shell中关于各种括号的讲解

    shell中各种括号的作用().(()).[].[[]].{} 一.小括号,圆括号()1.单小括号 ()   ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的 ...

  3. Python基础学习-Python中最常见括号()、[]、{}的区别

    Python中最常见括号的区别: 在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. Python中的 ...

  4. Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  5. Python中最常见括号()、[]、{}的区别

    在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. Python中的小括号(): 代表tuple元祖数 ...

  6. shell 中exec、source以及bash的区别

    在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...

  7. shell中如何取括号中的字符

    1. 使用grep(结果带括号,不知道有没有办法仅把括号中的内容匹配出来) $a='abc[edg]adfirpqu' $echo $a|grep -o '\[.*\]' #中括号的处理需要转义 [e ...

  8. shell中定义变量用双引号和单引号以及不用引号的区别

    1. 单引号 使用单引号的情况下,不管里面的是否有变量或者其他的表达是都是原样子输出 2. 双引号 如果其定义变量的时候使用双引号的话,则里面的变量或者函数会通过解析,解析完成后再输出内容,而不是把双 ...

  9. C语言中 单引号与双引号的区别

    在C语言中,字符用单引号,字符串用双引号.在c1='a';中,'a'是字符常量,必须用单引号."a"表示字符串,包含两个字符,一个是'a',一个是'\0'. 用数组来存储字符串. ...

随机推荐

  1. 找到第一个只出现一次的字符并返回它的位置(Python)

    s = 'hellobaby' def findchar(s): for i in s: if s.count(i)==1: return i, s.index(i) m,n=findchar(s) ...

  2. 【UR #17】滑稽树前做游戏

    假装看懂的样子 假装会做的样子 UOJ Round #17 题解 加上一个(t-w)^c,c是和i相连的点的度数 是一个多项式的话可以归纳证明 一些具体实现: 多项式存储,保留t,y, f=ai*t^ ...

  3. [poj3046][Ant counting数蚂蚁]

    题目链接 http://noi.openjudge.cn/ch0206/9289/ 描述 Bessie was poking around the ant hill one day watching ...

  4. Persits.Jpeg CMYK-to-RGB

    这几天发现有几个用户上传的图片显示一个“红叉叉”,用迅雷下载一看,原来图片的“模式”是CMYK,这样的模式是不能在IE中正常显示的. 我想起能不能用程序自动转换呢? 在网上看到利用Persits.Jp ...

  5. Django model中的 class Meta 详解

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...

  6. react缓存问题

    问题一: 问题描述: 我们公司自己的react项目,先打包部署v1.1版本,一切正常. v1.2版本做了很多页面和功能的修改和新增,但是打包部署之后,发现有些界面还是保持了v1.1的状态,比如有些新增 ...

  7. MyEclipse添加模板注释

    只有两个步骤: 1.设置模板 Windows—Preference—Java—Code Style—Code Templates 图中, Configure generated code and co ...

  8. vs widows服务的调试

    1.使用.net 工具安装你开发好的服务 2.服务运行后在Vs中选择调试>附加到进程 4.选择安装好运行的服务,选择附加

  9. C# 实现子窗体控制父窗体的方法

       我们来实现这样一个功能:当父窗体打开一个子窗体时隐藏父窗体的Panel,而当子窗体关闭时让Panel显示.实现的主要思路是创建一个子窗体的父类并在类中声明一个委托,当父窗体调用子窗体时绑定显示P ...

  10. docker存储与网络

    目录 Docker存储 挂载主机目录 创建一个数据卷 挂载一个宿主机目录作为数据卷 数据卷容器 创建一个数据卷容器 利用数据卷容器迁移数据 删除数据盘 Docker网络 简介 bridge网络 bri ...