算术运算
注意: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]mhello 33[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 必须要参与运算,才能得到最终的结果