• (三)shell编程之算术运算


    算术运算

    注意:bash 只支持整数,不支持小数

    * / % multiplication, division, remainder, %表示取模,即取余数,示例:9%4=1,5%3=2
    + - addition, subtraction
    i++ i-- variable post-increment and post-decrement
    ++i --i variable pre-increment and pre-decrement
    = *= /= %= += -= <<= >>= &= ^= |= assignment
    - + unary minus and plus
    ! ~ logical and bitwise negation
    ** exponentiation 乘方,即指数运算
    << >> left and right bitwise shifts
    <= >= < > comparison
    == != equality and inequality
    & bitwise AND
    | bitwise OR
    ^ bitwise exclusive OR
    && logical AND
    || logical OR
    expr?expr:expr conditional operator
    expr1 , expr2 comma
    

    乘法符号有些场景中需要转义

    实现算术运算:

    (1) let var=算术表达式
    (2) ((var=算术表达式)) 和上面等价
    (3) var=$[算术表达式]
    (4) var=$((算术表达式))
    (5) var=$(expr arg1 arg2 arg3 ...)
    (6) declare -i var = 数值
    (7) echo '算术表达式' | bc
    

    内建的随机数生成器变量:

    $RANDOM 取值范围:0-32767
    

    范例:

    #生成 0 - 49 之间随机数
    echo $[$RANDOM%50]
    #随机字体颜色
    [root@centos8 ~]#echo -e "33[1;$[RANDOM%7+31]mhello33[0m"
    longwang
    


    增强型赋值:

    += i+=10 相当于 i=i+10
    -= i-=j 相当于 i=i-j
    *=
    /=
    %=
    ++ i++,++i 相当于 i=i+1
    -- i--,--i 相当于 i=i-1
    

    格式:

    let varOPERvalue
    

    范例:

    [root@localhost ~]# let i=10*2
    [root@localhost ~]# echo $i
    20
    [root@localhost ~]# ((j=i+10))
    [root@localhost ~]# echo $j
    30
    

    范例:

    [root@localhost ~]# let count+=3
    [root@localhost ~]# i=10
    [root@localhost ~]# let i+=20
    [root@localhost ~]# echo $i
    30
    [root@localhost ~]# j=20
    [root@localhost ~]# let i*=j
    [root@localhost ~]# echo $i
    600
    

    范例:

    [root@localhost ~]# let var+=1
    [root@localhost ~]# let var++
    [root@localhost ~]# let var-=1
    [root@localhost ~]# let var--
    [root@localhost ~]# unset i j ; i=1; let j=i++; echo "i=$i,j=$j"
    i=2,j=1
    [root@localhost ~]# unset i j ; i=1; let j=++i; echo "i=$i,j=$j"
    i=2,j=2
    

    范例:

    [root@localhost ~]# expr 2 * 3
    expr: syntax error: unexpected argument ‘anaconda-ks.cfg’
    [root@localhost ~]# ls
    anaconda-ks.cfg  data.img  function  httpds2.sh  reset.sh
    [root@localhost ~]# expr 2 * 3
    6
    

    范例:

    [root@localhost ~]# echo "scale=3;20/3" | bc
    6.666
    

    范例:

    [root@localhost ~]# i=10
    [root@localhost ~]# j=20
    [root@localhost ~]# declare -i result=i*j
    [root@localhost ~]# echo $result 
    200
    

    范例:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
    鸡兔同笼,是中国古代著名典型趣题之一,记载于《孙子算经》之中。

    [root@localhost ~]# cat chook_rabbit.sh 
    #!/bin/bash
    HEAD=$1
    FOOT=$2
    
    RABBIT=$(((FOOT-HEAD-HEAD)/2))
    CHOOK=$[HEAD-RABBIT]
    echo RABBIT:$RABBIT
    echo CHOOK:$CHOOK
    
    [root@localhost ~]# bash -n chook_rabbit.sh 
    [root@localhost ~]# bash chook_rabbit.sh 30 80
    RABBIT:10
    CHOOK:20
    

    逻辑运算

    1  真  true
    0  假  false
    #注意,以上为二进制
    

    与:&:和0相与结果为0,和1相与结果保留原值, 一假则假,全真才真

    0 与 0 = 0
    0 与 1 = 0
    1 与 0 = 0
    1 与 1 = 1
    

    范例:

    [root@localhost ~]# x=$[2&6]
    [root@localhost ~]# echo $x
    2
    [root@localhost ~]# x=$[7&3]
    [root@localhost ~]# echo $x
    3
    

    或:|:和1相或结果为1,和0相或结果保留原值,一真则真,全假才假

    0 或 0 = 0
    0 或 1 = 1
    1 或 0 = 1
    1 或 1 = 1
    

    范例:

    [root@ubuntu1804 ~]#x=$[7|3]
    [root@ubuntu1804 ~]#echo $x
    7
    [root@ubuntu1804 ~]#x=$[2|5]
    [root@ubuntu1804 ~]#echo $x
    7
    

    非:!

    ! 1 = 0 ! true
    ! 0 = 1 ! false
    

    异或:^

    异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y

    0 ^ 0 = 0
    0 ^ 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0
    

    范例

    [root@centos8 ~]#true
    [root@centos8 ~]#echo $?
    0
    [root@centos8 ~]#false
    [root@centos8 ~]#echo $?
    1
    [root@centos8 ~]#! true
    [root@centos8 ~]#echo $?
    1
    [root@centos8 ~]#! false
    [root@centos8 ~]#echo $?
    0
    

    范例: 变量互换

    [root@centos8 ~]#x=10;y=20;temp=$x;x=$y;y=$temp;echo x=$x,y=$y
    x=20,y=10
    [root@centos8 ~]#x=10;y=20;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y
    x=20,y=10
    

    短路运算

    短路与 &&

    CMD1 短路与 CMD2
    第一个CMD1结果为真 (1),第二个CMD2必须要参与运算,才能得到最终的结果
    第一个CMD1结果为假 (0),总的结果必定为0,因此不需要执行CMD2
    

    短路或 ||

    CMD1 短路或 CMD2
    第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2
    第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果
    
  • 相关阅读:
    新闻发布项目——接口类(newsTbDao)
    新闻发布项目——接口类(commentDao)
    新闻发布项目——接口类(newsTbDao)
    新闻发布项目——接口类(UserDao)
    新闻发布项目——接口类(UserDao)
    新闻发布项目——接口类(UserDao)
    新闻发布项目——实体类(categoryTB)
    新闻发布项目——实体类(categoryTB)
    新闻发布项目——实体类(categoryTB)
    新闻发布项目——实体类(comment)
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14881423.html
Copyright © 2020-2023  润新知