Shell 编程基础之 [ 与 [[ 的异同

一、简介

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

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

二、异同分析

相同点

  1. 都支持算术比较 ("gt"、"ge"、"eq"、"ne"、"lt"、"le")
    user@ae01:~$ [ 2 -lt 10 ]&&echo true||echo false
    true
    user@ae01:~$ [ 2 -gt 10 ]&&echo true||echo false
    false

     

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

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

    user@ae01:~$ [[ 2 < 10 ]]&&echo true||echo false
    true
    user@ae01:~$ [[ 2 > 10 ]]&&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;逻辑或:-a]
      [ 1 -lt 2 ]:true; [ b > a ]:true
      user@ae01:~$ [ 1 -lt 2 -a b > a ]&&echo true||echo false
      true
      user@ae01:~$ [ 1 -gt 2 -a b > a ]&&echo true||echo false
      false
      user@ae01:~$ [ 1 -gt 2 -o b > a ]&&echo true||echo false
      true
    2. [[ 逻辑与:&&;逻辑或:|| ]]
      [ 1 -lt 2 ]:true; [ b > a ]:true
      user@ae01:~$ [[ 1 -lt 2 && b > a ]]&&echo true||echo false
      true
      user@ae01:~$ [[ 1 -gt 2 && b > a ]]&&echo true||echo false
      false
      user@ae01:~$ [[ 1 -gt 2 || 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:~$ [ 99+1 -eq 100 ]&&echo true||echo false
    -bash: [: 99+1: integer expression expected
    false
    user@ae01:~$ [ $((99+1)) -eq 100 ]&&echo true||echo false
    true
    user@ae01:~$ [[ 99+1 -eq 100 ]]&&echo true||echo false
    true

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。