shell脚本-算数运算


  Shell允许在某些情况下对算术表达式进行求值,比如:let和declare内置命令,(())复合命令和算术扩展。求值以固定宽度的整数进行,不检查溢出,尽管除以0被困并标记为错误。运算符及其优先级,关联性和值与C语言相同,以下运算符列表分组为等优先级运算符级别。级别按降序排列优先。

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

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

  实现算数运算:

  • let var=算数表达式
  • ((var=算数表达式))  和上面等价
  • var=$[算数表达式]
  • var=$((算数表达式))
  • var=$(expr arg1 arg2 arg3 ...)
  • declare -i var = 数值
  • echo '算数表达式' | bc

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

$RANDOM        取值范围:0-32767

  范例:

#生成 0 - 49 之间随机数
echo $[$RANDOM%50]

#随机字体颜色
[root@CentOS7 ~]# echo -e "\033[1;$[RANDOM%7+31]mhello\033[0m"
hello

   增强型赋值:

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

  格式:

let varOPERvalue

  例1:

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

  例2:

#自加3后自赋值
let count+=3

[root@CentOS7 ~]# i=10
[root@CentOS7 ~]# let i+=20        #相当于let i=i+20
[root@CentOS7 ~]# echo $i
30
[root@CentOS7 ~]# j=20
[root@CentOS7 ~]# let i*=j
[root@CentOS7 ~]# echo $i
600

  例3:

#自增,自减
let var+=1
let var++
let var-=1
let var--

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

  例4:

[root@CentOS7 ~]# expr 2 \* 3        #这里*需要用\转义
6

  例5:

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

  例6:

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

  例7:今有雉兔同笼,上有35头,下有94足,问雉兔各几何?

[root@CentOS7 ~]# cat chook_rabbit.sh 
#!/bin/bash
#
#*************************************************************************************
#Author:                      wanghaomiao
#QQ:                          1074035975
#Date:                        2022-01-05
#FileName                     chook_rabbit.sh
#URL:                         www.wanghaomiao.com.cn
#Description:                 The test script
#Copyreght (C):               2022 All rightsreserved
#*************************************************************************************
HEAD=$1
FOOT=$2

((RABBIT=(FOOT-HEAD-HEAD)/2))
((CHOOK=HEAD-RABBIT))
#PABBIT=$(((FOOT-HEAD-HEAD)/2))
#CHOOK=$[HEAD-RABBIT]

echo RABBIT:$RABBIT
echo CHOOK:$CHOOK
[root@CentOS7 ~]# bash chook_rabbit.sh 35 94
RABBIT:12
CHOOK:23