Bash编程中的字符串比较实用一般编程语言的比较操作符:


Bash中数值比较的操作符:

   比较         描述   比较           描述
n1 -eq n2
n1等于n2
n1 -ne n2n1不等于n2
n1 -gt n2n1大于n2n1 -lt n2n1小于n2
n1 -ge n2
n1大于等于n2
n1 -le n2n1小于等于n2
  • 数值比较只支持整数,不支持浮点数。


Bash中字符串比较的操作符:

比较
描述比较描述
  str1 = str2str1 等于 str2  str1 > str2str1 大于 str2
  str1 != str2str1 不等于 str2  -z str
str的长度为零,即为空
  str1 < str2str1 小于 str2  -n strstr的长度不为零,即不为空


  • 在用'>'和'<'进行字符串比较时,要对'>'和'<'作转义,否则会被shell解释为输出和输入重定向符。

    例:

    #!/bin/bash

    

    str="abcdefg"

    file=./datafile

    if [ "$str" > $file ]; then

        stat $file

    fi

    以上脚本代码的实质是在当前目录创建了一个文件名为'datafile'的空文件!并且无关str的内容!


  • 进行字符串比较时,对变量引用实用双引号引起来,否则容易出问题。

示例:

#!/bin/bash


str1="hello, 51cto"

str2="happy new year"


if [ "$str1" \> "$str2" ]; then

    echo "str1 is larger than str2"

else

    echo "str1 is smaller than str2"

fi


Bash中文件比较的操作符:

    比较      描述     比较        描述
-e file
file文件是否存在-s filefile存在且不为空
-d filefile存在且是目录-O file
file存在且被当前用户拥有
-f filefile存在且为文件-G filefile存在且默认组是当前用户组
-r file
file存在且具有可读权限file1 -nt file2
file1比file2新
-w filefile存在且具有可写权限file1 -ot file2file1比file2旧
-x filefile存在且具有可执行权限


  • 对文件进行 -r -w -x 相关的权限判断时,是相对当前执行该脚本或该操作的用户而言的。比如,

   -rwxr--r-- redhat redhat testfile  ,若以redhat用户执行" [ -x testfile ]",则结果为真,否则,其它任何普通用户执行,结果为假。

  • 若判断的文件是符号链接文件,则对文件进行 -r -w -x 相关的权限判断,以当前链接文件链接到的那个真正的文件或目录的权限来作判断。另外,如果只是删除符号链接文件本身,而不是要删除符号链接文件链接的那个文件或目录,使用命令:unlink symbolic_file_name


(())命令 和 [[]]命令

    双圆括号命令允许在比较中包含高级数学赋值表达式或数学比较表达式。除了支持test命令的基本数学操作符,还支持以下数学操作符:

符号
描述符号描述
val++
先引用后自加一
<< n左移n位
val--
先引用后自减一>> n右移n位
++val先自加一后引用&&
逻辑与
--val先自减一后引用||逻辑或

逻辑取反&按位与
~按位取反|按位或
**幂运算


  • 在双圆括号内的表达式,'>','<'不用作转义。表达式也可以不用和前后双圆括号之间有空格。

  • 在双圆括号内的表达式中,对变量的引用可以不用加'$',而直接使用变量名

    #!/bin/bash

    

    var1=10

    if ((var2=var1**2)) && ((var2 > 50)) ; then

        echo "the value of var2 is more than 50."

    fi

    echo "var2=$var2"


    双方括号命令对test命令的扩展,体现在双方括号内的字符串表达式支持glob的正则表达式

    #!/bin/bash

    

    match_str="9 .99"

    if [[ $match_str = 9?.* ]]; then

        echo "match by glob -> match_str :$match_str "

    fi