shell中比较(文件测试,字符串,整数)

文件测试(-f,-d,-r,-r,...)
  1. [ -f /root/file.txt ],[ -d /root/mydir ]
  2. [[ -f /root/file.txt ]]
    文件测试方面[[]]与[]一样
字符串比较(-z,-n,!=,==,...)
  1. [ -z "${str}" ],[ "${str}" != "${str}" ],[ ! -n "${str}" ]
    []只能用于字符比较,不能用于模式匹配
  2. [[ -z "${str}" ]],[[ ! -n "${str}" ]]
  3. [[ $a == z* ]]          # 如果$a以"z"开头(模式匹配)那么将为true
    [[ hello == hell? ]]    # 模式匹配
    [[ ab == "test" ]]      # 如果$a等于"test",那么结果为true
    [[]]可以进行模式匹配,使用"str"则str为字符串对待
  4. 字符串比较时可以把右边的作为一个模式(这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是一个文本字符串。),而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。
  5. 使用-a,-o进行逻辑连接:[ "${str1}" == "test" -a -z "${str}" ]
  6. 使用-a,-o进行逻辑连接:[[ "${str1}" == "test" && -z "${str}" ]]
    []使用-a,-o,[[]]使用&&,||
  7. 字符串包含:[[ "$a3" =~ "$a1" ]]
    如果a1包含在a3中,则为真
算术比较
  1. ((4 > 2)),((4+2 > 3))
    #这个算术运算,整数比较都适用
  2. [ 5 -gt 3 ],[ 5 \> 3 ]
  3. [[ 5 > 3 ]],[[ 5 -gt 3 ]]
  4. [[3+5 -gt 2]]
    不可使用<,>,结果经常出错
  5. ((a + b))
    结果为非0值时,返回真
 
[...],[[...]],((...))区别
 
  1. 在bash中((...))主要进行算术运算(上面的两个都不行),也比较适合进行整数比较,可以直接使用熟悉的<,>等比较运算符。可以直接使用变量名如var而不需要$var这样的形式。支持分号隔开的多个表达式
  2. 在命令行里test expr和[ expr ]的效果相同。test的三个基本作用是判断文件、判断字符串、判断整数。支持使用与或非将表达式连接起来
    2.test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。如果比较"ab"和"bc",必须使用转义符:[ ab \< bc ]
  3. [[ ]],这是内置在shell中的一个命令,它支持字符串的模式匹配,逻辑组合可以不使用test的-a,-o而使用&&,||这样更亲切的形式
  4. [ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">"与"<"必须转义,否则就变成IO改向操作符了. 在[[中"<"与">"不需转义
附:比较命令
运算符 描述 示例
文件比较运算符
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]

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