zoukankan      html  css  js  c++  java
  • 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;逻辑或:-o]
        [ 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
  • 相关阅读:
    HIDS逐渐的成为主流 java程序员
    怎样做反向域名解析(反向DNS解析)? java程序员
    入侵检测系统的性能的辨别(2) java程序员
    Codeforces Round #146 (Div. 2)
    usaco1.34Prime Cryptarithm
    poj3667 hotel(线段树区间合并)
    poj1330Nearest Common Ancestors(水LCA)
    hdu4135Coprime(容斥原理)
    hdu1541Stars(树状数组)
    usaco 1.43Arithmetic Progressions
  • 原文地址:https://www.cnblogs.com/tannerBG/p/4065333.html
Copyright © 2011-2022 走看看