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. luogu2312 [NOIp2015]解方程 (秦九韶)

    秦九韶算法:多项式$a_0+a_1x+a_2x^2+...+a_nx^n=a_0+x(a_1+x(a_2+...+(xa_n))..)$,这样对于一个x,可以在O(n)求出结果 为了避免高精度,我们同 ...

  2. Logstash grok解析IIS 10.0 日志实例

    Logstash解析IIS日志的核心在于logstash配置文件 IIS 日志位置和格式如下: #Software: Microsoft Internet Information Services 1 ...

  3. android 之 Hnadler 、Message 、Looper

    Handler定义: 主要接受子线程发送来的数据,并用此数据配合主线程更新UI. 为什么要用Handler? 我们手机当中的很多功能或操作是不能都放在Activity当中的,比如下载文件.处理大量数据 ...

  4. babel与ES6环境的搭建

    我们知道浏览器环境下直接运行ES6是存在一些兼容性问题的.那么把ES6变成ES5不就行了吗? 那如何将ES6转换成ES5呢?我们来搭建它的转换环境吧~ 第一步:初始化项目,建立写注意事项的README ...

  5. opencv 霍夫变换 实现图片旋转角度计算

    在OCR实际开发中,证件照采集角度有很大的偏差,需要将图片进行旋转校正, 效果图: 在应用中发现应该加入高斯模糊,可以极大减少误差线条. 知道线条后 通过求斜率 得旋转角度 .(x1-x2)/(y1- ...

  6. PHP自动加载(__autoload和spl_autoload_register)

    一:什么是自动加载 我们在new出一个class的时候,不需要手动去require或include来导入这个class文件,而是程序自动帮你导入这个文件不需要手动的require那么多class文件了 ...

  7. C# 同步工作站与SQL服务器的时间

    /// <summary> /// 设置本机时间 /// </summary> public class LocalTimeSync { [DllImport("Ke ...

  8. ML面试题网站及ML模型网站

    一.面试题网站 1)最全:http://www.epx365.cn/jyzn/201839501.html 2)七月在线:https://blog.csdn.net/movie14/article/d ...

  9. Unity做AR

    Unity做AR呢这里借助了高通的AR包 这里是视频教程  http://www.tudou.com/programs/view/dnvEbIubNzI/ 这里是结果演示  http://www.tu ...

  10. python---wsgiref初探

    wsgiref使用 from wsgiref.simple_server import make_server from urls import URLS def RunServer(environ, ...