1.     概念上来说

"[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
"["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调

2.     相同:二者都支持算术比较和字符串比较表达式(具体使用可能有点不同)

(1)"-gt", "-lt"是算术比较操作符,用于比较整数的大小。
(2)">", "<"是字符串比较操作符,用于比较字符串的大小,使用字典顺序,与当前的locale有关。

(3).关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A<B,A<a, 1<2。再强调一次,这里只要用了"<"、">",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。

(4)建议在使用数值比较的时候,使用let,(())命令,否则容易出错;

2.1  “[“用法

$ [ 2 -lt 10 ]&&echo true&&echo false

true

$  [ 2 -gt 10 ]&&echo true||echo false

false

$  [ 2 \< 10 ]&&echo true||echo false  #you should use "\<"

false

$  [ 2 \> 10 ]&&echo true||echo false  #you should use "\>"

true

2.2     “[[“用法

$  [[ 2 -gt 10 ]]&&echo true||echo false

false

$  [[ 2 -lt 10 ]]&&echo true||echo false

true

$  [[ 2 < 10 ]]&&echo true||echo false

false

$  [[ 2 > 10 ]]&&echo true||echo false

true

3.        相同:都支持简单的模式匹配

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

3.1  “[“用法

$ [ test = test ]&&echo true||echo false  #normal compare

true

$ [ test = t*t ]&&echo true||echo false  #pattern match.

true

$ [ test = t..t ]&&echo true||echo false  #not match.

false

$ [ test = t??t ]&&echo true||echo false  #note that "?", not "." stands for one single character here

true

$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the pattern,使用引用关闭了?的特殊功能

false

3.2  “[[“用法

$ [[ test = test ]]&&echo true||echo false  #normal compare

true

$ [[ test = t*t ]]&&echo true||echo false  #pattern match.

true

$ [[ test = t..t ]]&&echo true||echo false  #not match.

false

$ [[ test = t??t ]]&&echo true||echo false  #note that "?", not "." stands for one single character here

true

$ [[ test = "t??t" ]]&&echo true||echo false # alert: don't quote the pattern,使用引用关闭了?的特殊功能

false

4.        不同点

4.1     逻辑与和逻辑或

(1)"[":逻辑与:"-a";逻辑或:"-o";

(2)"[[":逻辑与:"&&";逻辑或:"||"

$ [[ 1 < 2 && b > a ]]&&echo true||echo false

true

$ [[ 1 < 2 -a b > a ]]&&echo true||echo false

bash: syntax error in conditional expression

bash: syntax error near `-a'

$ [ 1 < 2 -a b > a ]&&echo true||echo false

true

$ [ 1 < 2 && b > a ]&&echo true||echo false  #wrong syntax

bash: [: missing `]'

false

$ [ 1 < 2 \&\& b > a ]&&echo true||echo false  #aslo wrong

bash: [: &&: binary operator expected

false

4.2     命令行参数

(1)[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"<"必须转义,否则就变成IO重定向了;

(2)由于"[["是关键字,不会做命令行扩展,所以在[[中"<"与">"不需转义,但是相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做;

$ [ "-z" "" ]&&echo true||echo false

true

$ [ -z "" ]&&echo true||echo false

true

$ [[ "-z" "" ]]&&echo true||echo false

bash: conditional binary operator expected

bash: syntax error near `""'

$ [[ -z "" ]]&&echo true||echo false

true

4.3  [[ ... ]]进行算术扩展,而[ ... ]不做

$ [[ 99+1 -eq 100 ]]&&echo true||echo false

true

$ [ 99+1 -eq 100 ]&&echo true||echo false

bash: [: 99+1: integer expression expected

false

$ [ $((99+1)) -eq 100 ]&&echo true||echo false

true

4.4  正则表达式匹配"=~"

regular expression match. This operator was introduced with version 3 of Bash.
The =~ Regular Expression matching operator within a double brackets test expression.

转自:https://blog.csdn.net/ysdaniel/article/details/7905818

Shell中[和[[的异同的更多相关文章

  1. Linux Shell 中 > 和 >> 的异同点和应用场景

    Linux Shell 中 > 和 >> 的异同点和应用场景 > 和 >> 的异同点 举例说明(start.sh 为某个服务的启动脚本,start.log 为某服务 ...

  2. linux shell 中的sleep命令

    开始还以为是这样的语法: sleep(1), 后面发现是: linux shell 中的sleep命令 分类: LINUX 在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小 ...

  3. shell 中的与、或表达式

    今天总结一下linux shell中逻辑关机表达方式.逻辑与的表达: 1).if [ $xxx=a -a $xx=b ] 注:-a表示and的意思 2).if [ $xxx=a ] && ...

  4. shell简单用法笔记(shell中数值运算)二

    shell中变量值,如果不手动指定类型,默认都是字符串类型: 例如: a= b= c=$a+#b echo $c 结果会输出:123+456 shell中,如果要进行数值运算,可以通过一下方法: 方法 ...

  5. shell中{}的妙用

    shell中${}的妙用   1. 截断功能 ${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:    拿 ...

  6. shell中命令之间数据的传递

    1.管道 "|" ls | cat -n > out.txt 2. 子shell 2.1 子shell 说明 在shell脚本中可以用()操作符可以定义一个子shell #/ ...

  7. shell中&&和||的使用方法

    测试题: [ -z "" ] && echo 0 || echo 1 的结果是多少 看看这两个 && || 的用户  http://blog.csd ...

  8. 任督二脉之Shell中的正则表达式

    VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...

  9. shell中条件判断if中的-z到-d的意思

    shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 ...

随机推荐

  1. rpm命令的简介-(转自jb51.net )

    在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的"添加/删除程序",但是功能又比"添加/删除程序"强很多,它就是Red Hat Pa ...

  2. 校准仪的开发 ---等下整理 迪文屏的ICO文件 和输出配置问题

    要有ICO文件才能

  3. Canvas跟随鼠标炫彩小球

    跟随鼠标炫彩小球 canvas没有让我失望,真的很有意思 实现效果 超级炫酷 实现原理 创建小球 给小球添加随机颜色,随机半径 鼠标移动通过实例化,新增小球 通过调用给原型新增的方法,来实现小球的动画 ...

  4. Idea项目上传到gitlab(以新建项目为例)

    1.首先,需要你自己登录GitLab,并新建一个项目的链接,如下图所示: 图一: 图二: 图三(idea上传时用到此链接): 2.在idea上新建一个demo项目,创建一个Git仓库: 3.点击创建后 ...

  5. 第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松

    第11讲 | TCP协议(上):因性恶而复杂,先恶后善反轻松 TCP 包头格式 我们先来看 TCP 头的格式.从这个图上可以看出,它比 UDP 复杂得多. 首先,源端口号和目标端口号是不可少的,这一点 ...

  6. Archlinux常用软件推荐 更新于2021年4月

    记录一下常用软件 必装软件 包管理工具 yay 代替pacman的包管理 yaourt 备用 终端工具 zsh oh-my-zsh-git 搭配zsh利器` proxychains4 终端代理工具` ...

  7. 【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例

    问题描述 在微软云环境中,使用python SDK连接存储账号(Storage Account)需要计算Blob大小?虽然Azure提供了一个专用工具Azure Storage Explorer可以统 ...

  8. 对抗性鲁棒性与模型压缩:ICCV2019论文解析

    对抗性鲁棒性与模型压缩:ICCV2019论文解析 Adversarial Robustness vs. Model Compression, or Both? 论文链接: http://openacc ...

  9. 图分析Rapids cuGraph

    图分析Rapids cuGraph 英伟达(Nvidia)建立的新的开源库可能是推进分析和使图形数据库更快的秘密要素. 在Nvidia GPU上进行并行处理. Nvidia很久以前就不再只是" ...

  10. 四、提高SSH服务安全

    配置基本安全策略 [root@proxy ~]# vim /etc/ssh/sshd_config    //调整sshd服务配置 .. .. Protocol 2                   ...