一、简介

[ 与 test 等价,是 bash 的内部命令,GNU/linux 系统的 coreutils 软件包通常带 /usr/bin/test 和 /usr/bin/[ 命令。如果我们不用绝对路径指 明,通常我们用的都是bash 自带的命令。

[[ 是 bash 关键字(据说从2.02起引入对[[的支持)

二、异同分析

相同点

  1. 都支持算术比较 ("gt"、"ge"、"eq"、"ne"、"lt"、"le")

    user@ae01:~$ [  -lt  ]&&echo true||echo false
    true
    user@ae01:~$ [  -gt  ]&&echo true||echo false
    false
    user@ae01:~$ [[  -lt  ]]&&echo true||echo false
    true
    user@ae01:~$ [[  -gt  ]]&&echo true||echo false
    false
  2. 都支持字符串比较("<"、">" 但具体使用有些不同)
    关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A<B,A<a, 1<2。再强调一次,这里只要用了"<"、">",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。
    user@ae01:~$ [  \<  ]&&echo true||echo false
    false
    user@ae01:~$ [  \>  ]&&echo true||echo false
    true

    注意转义字符\的使用,否则bash会认为是标准输出重定向。

    user@ae01:~$ [[  <  ]]&&echo true||echo false
    true
    user@ae01:~$ [[  >  ]]&&echo true||echo false
    false
  3. 都支持简单模式的匹配
    user@ae01:~$ [ test = test ]&&echo true||echo false
    true
    user@ae01:~$ [ test = t*t ]&&echo true||echo false
    true
    user@ae01:~$ [ test = t..t ]&&echo true||echo false
    false
    user@ae01:~$ [ test = t??t ]&&echo true||echo false
    true
    user@ae01:~$ [[ test = test ]]&&echo true||echo false
    true
    user@ae01:~$ [[ test = t*t ]]&&echo true||echo false
    true
    user@ae01:~$ [[ test = t..t ]]&&echo true||echo false
    false
    user@ae01:~$ [[ test = t??t ]]&&echo true||echo false
    true

    模式匹配类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起,使用引用关闭了某些元字符的特殊功能。

不同点

  1. 逻辑与和逻辑或
    1. [ 逻辑与:-a;逻辑或:-o]
      [ 1 -lt 2 ]:true; [ b > a ]:true

      user@ae01:~$ [  -lt  -a b > a ]&&echo true||echo false
      true
      user@ae01:~$ [  -gt  -a b > a ]&&echo true||echo false
      false
      user@ae01:~$ [  -gt  -o b > a ]&&echo true||echo false
      true
    2. [[ 逻辑与:&&;逻辑或:|| ]]
      [ 1 -lt 2 ]:true; [ b > a ]:true
      user@ae01:~$ [[  -lt  && b > a ]]&&echo true||echo false
      true
      user@ae01:~$ [[  -gt  && b > a ]]&&echo true||echo false
      false
      user@ae01:~$ [[  -gt  || b > a ]]&&echo true||echo false
      true
  2. 命令行参数
    "[["是关键字,不会做命令行扩展,所以在[[中"<"与">"不需转义,但是相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做
    user@ae01:~$ [ "-z" "" ]&&echo true||echo false
    true
    user@ae01:~$ [[ "-z" "" ]]&&echo true||echo false
    -bash: conditional binary operator expected
    -bash: syntax error near `""'
  3. 算术扩展
    [[ ... ]]进行算术扩展,而[ ... ]不行,[ ... ]需要使用$(())
    user@ae01:~$ [ + -eq  ]&&echo true||echo false
    -bash: [: +: integer expression expected
    false
    user@ae01:~$ [ $((99+1)) -eq  ]&&echo true||echo false
    true
    user@ae01:~$ [[ + -eq  ]]&&echo true||echo false
    true

Shell 编程基础之 [ 与 [[ 的异同的更多相关文章

  1. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  2. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  3. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  4. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  5. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  6. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  7. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  8. shell编程基础进阶

    为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...

  9. 基于Linux系统的Shell编程-基础篇

    1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...

随机推荐

  1. 通过jquery的serializearray处理表单数据成json格式,并提交到后台处理

    var params = $("#myform").serializeArray(); var values = {}; for (var item in params) { va ...

  2. 构建兼容浏览器的Angularjs web应用

    背景 随着mvvm逐渐成熟,现在使用jQuery构建web应用已经显得过时了,而且使用jQuery需要编写更多的代码去控制dom的取值.赋值.绑定事件等,而mvv从底层实现了对以上操作的支持,让程序员 ...

  3. Table

    Table tb = new Table();TableRow r = new TableRow(); TableCell c = new TableCell();c.Text = "Sta ...

  4. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  5. [Unity3d]调试问题之UI/Image不显示

    问题描述 在项目中添加的UI/Image资源,在PC和通过Unity Remove测试都没有问题: PC上的效果 手机上Unity Remove测试结果 可真正发布到手机上运行则如下显示,说明imag ...

  6. BerkeleyDB库简介

    BerkeleyDB库简介 BerkeleyDB(简称为BDB)是一种以key-value为结构的嵌入式数据库引擎: 嵌入式:bdb提供了一系列应用程序接口(API),调用这些接口很简单,应用程序和b ...

  7. 一个类似宣传的H5页面

    趁着闲置 做了一个H5的页面 感觉不错. 具体效果如下 框架上我选择 zepto(其实这个可有可无,推荐用原生的最好) FullPage (感觉挺好用的一个全屏滚动插件 ) pageResponse ...

  8. 【PHP开发篇】一个统计客户端商机提交的获取IP地址

    1.对客服提交数据的ip地址记录. 获取ip地址的方法: public function getIP() { global $ip; if (getenv("HTTP_X_REAL_IP&q ...

  9. 【转载】使用Pandas对数据进行筛选和排序

    使用Pandas对数据进行筛选和排序 本文转载自:蓝鲸的网站分析笔记 原文链接:使用Pandas对数据进行筛选和排序 目录: sort() 对单列数据进行排序 对多列数据进行排序 获取金额最小前10项 ...

  10. [译]merge vs rebase

    git rebase和git merge设计的初衷是解决相同的一件事, 即把一个分支合并到另外一个分支--只是他们两个处理的方式非常不一样. 当你在一个特定的分支开发新功能, 团队的其它成员在mast ...