当前位置 博文首页 > RtxTitanV的博客:Shell编程之运算符

    RtxTitanV的博客:Shell编程之运算符

    作者:[db:作者] 时间:2021-07-07 10:02

    本文主要对Shell中的运算符进行简单总结,另外本文所使用的Linux环境为CentOS Linux release 8.1.1911,所使用的Shell为bash 4.4.19(1)-release

    一、算术运算符

    运算符说明示例
    +单目正号((+3))结果为3
    -单目负号((-3))结果为-3
    ++自增(变量前,先运算后取值;变量后,先取值后运算)b=2((a=++b))后a为3,b为3;((a=b++))后a为2,b为3
    自减(变量前,先运算后取值;变量后,先取值后运算)b=2((a=--b))后a为1,b为1;((a=b--))后a为2,b为1
    +expr 3 + 2结果为5
    -expr 3 - 2结果为1
    *expr 3 \* 2结果为6
    /expr 3 / 2结果为1
    %取模expr 3 % 2结果为1
    **幂运算((3**2))结果为9

    expr可用于整数运算,也可以处理字符串,使用expr进行运算时,表达式和运算符之间必须加空格,乘号*和小括号()前要加\转义(小括号是左右括号前都要加\转义)。
    (( expression ))会对算术表达式求值,如果表达式的值不是0,则返回状态是0,否则返回状态是1,这和let "expression"等价。
    (( ))前面加上$符号可以获取(( ))命令的执行结果,即整个表达式的值。
    (( ))只能进行整数运算,不能对浮点数或字符串进行运算。

    示例如下:

    #!/bin/bash
    
    # 单目正负号
    echo "单目正负号"
    a=3
    echo $((+a)) $((-a))
    
    # 自增自减运算
    echo "自增自减运算"
    b=2
    echo "b:${b}"
    ((a=++b))
    echo "a=++b : a:${a},b:${b}"
    b=2
    ((a=b++))
    echo "a=b++ : a:${a},b:${b}"
    b=2
    ((a=--b))
    echo "a=--b : a:${a},b:${b}"
    b=2
    ((a=b--))
    echo "a=b-- : a:${a},b:${b}"
    
    # 加减乘除、取模、幂运算
    echo "加减乘除、取模、幂运算"
    a=3
    b=2
    echo "a:${a},b:${b}"
    echo "a + b : `expr ${a} + ${b}`"
    echo "a - b : `expr ${a} - ${b}`"
    echo "a * b : `expr ${a} \* ${b}`"
    echo "a / b : `expr ${a} / ${b}`"
    echo "a % b : `expr ${a} % ${b}`"
    # 这里暂时用^符号来表示指数
    echo "a^b : $((${a}**${b}))"
    

    执行结果:
    1

    二、赋值运算符

    运算符说明示例
    =赋值c=3 a=${c}则a为3
    +=加赋值如果a为3,b为2,则((a+=b))后a为5,b为2
    -=减赋值如果a为3,b为2,则((a-=b))后a为1,b为2
    *=乘赋值如果a为3,b为2,则((a*=b))后a为6,b为2
    /=除赋值如果a为3,b为2,则((a/=b))后a为1,b为2
    %=取模赋值如果a为3,b为2,则((a%=b))后a为1,b为2
    <<=左移位赋值如果a为3,b为2,则((a<<=b))后a为12,b为2
    >>=右移位赋值如果a为3,b为2,则((a>>=b))后a为0,b为2
    &=按位与赋值如果a为3,b为2,则((a&=b))后a为2,b为2
    |=按位或赋值如果a为3,b为2,则((a|=b))后a为3,b为2
    ^=按位异或赋值如果a为3,b为2,则((a^=b))后a为1,b为2

    可以使用(( ))let命令进行运算,let(( ))用法类似,都是用于整数运算。

    示例如下:

    #!/bin/bash
    
    a=3
    b=2
    echo "a:${a},b:${b}"
    ((a+=b))
    echo "a+=b : a:${a},b:${b}"
    a=3
    b=2
    ((a-=b))
    echo "a-=b : a:${a},b:${b}"
    a=3
    b=2
    ((a*=b))
    echo "a*=b : a:${a},b:${b}"
    a=3
    b=2
    ((a/=b))
    echo "a/=b : a:${a},b:${b}"
    a=3
    b=2
    ((a%=b))
    echo "a%=b : a:${a},b:${b}"
    a=3
    b=2
    ((a<<=b))
    echo "a<<=b : a:${a},b:${b}"
    a=3
    b=2
    ((a>>=b))
    echo "a>>=b : a:${a},b:${b}"
    a=3
    b=2
    ((a&=b))
    echo "a&=b : a:${a},b:${b}"
    a=3
    b=2
    ((a|=b))
    echo "a|=b : a:${a},b:${b}"
    a=3
    b=2
    ((a^=b))
    echo "a^=b : a:${a},b:${b}"
    

    执行结果:
    2

    三、关系运算符

    test[][[ ]]中使用的关系运算符:

    运算符说明示例
    -eq(equal)检测两个数是否相等,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -eq ${b} ]返回1
    -ne(not equal)检测两个数是否不相等,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -ne ${b} ]返回0
    -gt(greater than)检测左边的数是否大于右边的,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -gt ${b} ]返回0
    -lt(less than)检测左边的数是否小于右边的,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -lt ${b} ]返回1
    -ge(greater equal)检测左边的数是否大于等于右边的,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -ge ${b} ]返回0
    -le(less equal)检测左边的数是否小于等于右边的,是返回0,否则返回1。如果a为3,b为2,则[ ${a} -le ${b} ]返回1

    每一条Shell命令,在退出(运行结束)时都会返回一个比较小的整数值给调用它的程序,这就是命令的退出状态。一般来说,退出状态为0表示成功(true),非0表示失败(false),if语句的判定条件,从本质上判断的就是命令的退出状态。
    [][[ ]]与里面的条件表达式之间要有空格,例如[${a}==${b}]是错误的,必须写成[ ${a} == ${b} ][]test是等价的。

    示例如下:

    #!/bin/bash
    
    a=3
    b=2
    echo "a:${a},b:${b}"
    if [ ${a} -eq ${b} ]
    then
        echo "${a} -eq ${b} : a等于b"
    else
        echo "${a} -eq ${b} : a不等于b"
    fi
    if [ ${a} -ne ${b} ]
    then
        echo "${a} -ne ${b} : a不等于b"
    else
        echo "${a} -ne ${b} : a等于b"
    fi
    if [ ${a} -gt ${b} ]
    then
        echo "${a} -gt ${b} : a大于b"
    else
        echo "${a} -gt ${b} : a不大于b"
    fi
    if [ ${a} -lt ${b} ]
    then
        echo "${a} -lt ${b} : a小于b"
    else
        echo "${a} -lt ${b} : a不小于b"
    fi
    if [ ${a} -ge ${b} ]
    then
        echo "${a} -ge ${b} : a大于或等于b"
    else
        echo "${a} -ge ${b} : a小于b"
    fi
    if [ ${a} -le ${b} ]
    then
        echo "${a} -le ${b} : a小于或等于b"
    else
        echo "${a} -le ${b} : a大于b"
    fi
    

    执行结果:
    3
    (())中使用的关系运算符:

    运算符示例
    ==检测两个数是否相等,是返回0,否则返回1。如果a为3,b为2,则((a==b))返回1
    !=检测两个数是否不相等,是返回0,否则返回1。如果a为3,b为2,则((a!=b))返回0
    >检测左边的数是否大于右边的,是返回0,否则返回1。如果a为3,b为2,则((a>b))返回0
    >=检测左边的数是否大于等于右边的,是返回0,否则返回1。如果a为3,b为2,则((a>=b))返回0
    <检测左边的数是否小于右边的,是返回0,否则返回1。如果a为3,b为2,则((a<b))返回1
    <=检测左边的数是否小于等于右边的,是返回0,否则返回1。如果a为3,b为2,则((a<=b))返回1

    关系运算符只支持整数数字,不支持字符串,除非字符串的值是整数数字。注意(( ))中表达式的值不是0,返回状态才是0,否则返回状态是1,(( ))进行整数比较的时候表达式的值与(())返回状态正好相反,表达式的值为0,返回状态为1,表达式的值为1,返回状态为0。

    (( ))中使用的示例如下:

    #!/bin/bash
    
    a=3
    b=2
    echo "a:${a},b:${b}"
    if ((a==b))
    then 
        echo "${a}==${b} : a等于b"
    else
        echo "${a}==${b} : a不等于b"
    fi
    if ((a!=b))
    then 
        echo "${a}!=${b} : a不等于b"
    else
        echo "${a}!=${b} : a等于b"
    fi
    if ((a>b))
    then 
        echo "${a}>${b} : a大于b"
    else
        echo "${a}>${b} : a不大于b"
    fi
    if ((a>=b))
    then 
        echo "${a}>=${b} : a大于或等于b"
    else
        echo "${a}>=${b} : a小于b"
    fi
    if ((a<b))
    then 
        echo "${a}<${b} : a小于b"
    else
        echo "${a}<${b} : a不小于b"
    fi
    if ((a<=b))
    then 
        echo "${a}<=${b} : a小于或等于b"
    else
        echo "${a}<=${b} : a大于b"
    fi
    

    执行结果:
    4

    四、字符串运算符

    可以在test[][[ ]]中使用:

    运算符说明示例
    ==、=如果两个字符串相等,则为true。如果a为"expression",b为"expansion",则[[ ${a} == ${b} ]]返回1
    !=如果两个字符串不相等,则为true。如果a为"expression",b为"expansion",则[[ ${a} != ${b} ]]返回0
    >如果左边字符串在字典顺序上排在右边字符串之后,则为true。如果a为"expression",b为"expansion",则[[ ${a} > ${b} ]]返回0
    <如果左边字符串在字典顺序上排在右边字符串之前,则为true。如果a为"expression",b为"expansion",则[[ ${a} < ${b} ]]返回1
    -z如果字符串的长度为零,则为true。如果a为"expression",则[[ -z ${a} ]]返回1
    -n、string如果字符串的长度不为零,则为true。如果a为"expression",则[[ -n ${a} ]][[ ${a} ]]返回0

    注意:

    • test[][[ ]]中使用字符串运算符===!=><只能比较字符串(只是字符串的值为数字时可以把它当成数字来比较,这只是字符串比较的结果与数值比较正好巧合,不推荐用它来比较数字,如[[ -3 < -2 ]]返回1,[[ 03 < 2 ]]返回0,[[ 1.5 == 1.50 ]]返回1,都是错误结果。
    • 如果要使用test[][[ ]]比较整数,需使用关系运算符-eq-ne-gt-lt-ge-le,推荐在(( ))中使用关系运算符==!=><>=<=进行整数比较。
    • test[]使用><需要加\转义,[[ ]]则不需要转义。
    • 使用test[][[ ]]则没有>=<=,可以通过[ ${a} \> ${b} -o ${a} == ${b} ][[ ${a} > ${b} || ${a} == ${b} ]]这种方式替代。
    • test[]会进行单词拆分,而[[ ]]不会进行单词拆分。
    • 当与[[ ]]一起使用时,<>使用当前区域设置按字典顺序排序,test命令使用ASCII排序。

    示例如下:

    #!/bin/bash
    
    a="expression"
    b="expansion"
    echo "a:${a},b:${b}"
    if [[ ${a}
    
    下一篇:没有了