(三)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 必须要参与运算,才能得到最终的结果
原文地址:https://www.cnblogs.com/xuanlv-0413/p/14881423.html