基本运算类别

四则运算

-加法: num1 + num2
-减法: num1 - num2
-乘法: num1 *num2
-整除: num1 / num2

取余数运算

-求模: num1 % num2(是用来计算第一个整数除以第二个整数剩下的余数)

计算并获取结果
•使用 expr 命令工具
-格式: expr 整数1 运算符整数2 …
-乘法操作应采用*转义,避免被作为Shell通配符
-计算结果直接显示在屏幕上
[root@svr5~# X=48 ;Y=21
[root@svr5~]# expr SX + 100 - $Y * 2 / 7 //混合运算,乘除优先
142
[root@svr5~]# expr SX / SY //除法,取整数
[root@svr5 ~#expr $X % $Y //除法,取余数
注意:
乘法操作应采用*转义,避免被作为Shell通配符
在expr命令行中参与运算的整数值和运算符之间必须至少有一个空格不然会出错

算式替换

使用 []表达式格式:[]表达式 -格式:[整数1 运算符整数2 …]
-乘法操作无需转义,运算符两侧可以无空格,引用变量可省略符号 -计算结果替换表达式本身,结合echo命令才能显示到屏幕上 [root@svr5~]# X=48;Y=21 [root@svr5~]# echo[X+100-Y*2/7] //混合运算,乘除优先
142
[root@svr5~]# echo $[X/Y]    //除法,取整数
2
[root@svr5~]# echo $[X%Y]    //除法,取余数
6
[root@svr5~]# echo [103]//[10**3] //[ ]表达式还支持乘方运算
1000

整数运算实例

•识别一个整数是奇数还是偶数
-取与2相除的余数,结果为0表示该整数为偶数,否则为奇数
•识别一个整数是否为7的倍数
-取与7相除的余数,结果为0表示该整数是7的倍数,否则不是
[root@svr5~]# X=48;  Y=21
[root@svr5~]# echo  [X[X%2],[Y%2]
0, 1    //X的值为偶数,  Y的值为奇数
[root@svr5~]#echo [X[X%7], [Y%7]
60    //Y的值是7的倍数,X的值不是

自增表达式

•适用于更改单个变量的值
-先运算,将运算结果保存到这个变量
-后取值,以这个变量的新值作为整个表达式的值
运算类别 对应的表达式 应用示例

运算类别 对应的表达式 应用实例
加法 i+=2 或者i=i+2 echo $[i+=2]
减法 i-=2 或者i=i-2 echo $[i-=2]
乘法 i*=2 或者i=i*2 echo $[i*=2]
除法 i/=2或者i=i/2 echo $[i/=2]
求模 i%=2 或者i=i%2 echo $[i%=2]

i+=1的极简化表示

•当变量自增/减的数量为1时
-数量1可以省略、+=可写成 ++、-=可写成–
-比如,++i 相当于 i+=1、–i相当于i-=1
[root@svr5 ~]# X=48; Y=21
[root@svr5^]# echo  [++X],[++X],[–Y] //先保存运算结果,再取值
[root@svr5~]# echo  SX,SY
49,20

++i与i++的区别

•运算符在前,++i或–i
-先运算,将运算结果保存到这个变量
-后取值,调用这个变量的新值
[root@svr5~]# X=48 ; echo [++X],[++X],X
49,49 //先运算,后取值
•运算符在后,i++\或 i--
-先取值,调用这个变量的旧值
-后运算,将运算结果保存到这个变量
[root@svr5~]# X=48; echo $[X++], $X
48,49 //先取值,后运算

使用let命令操作变量

•操作变量值运算,并保存新结果
-适用于不需要输出的情况,比如循环次数记录
-若要查看结果,可结合echo命令
[root@svr5 ~]# X=48;Y=21
[root@svr5~]# let X++,Y/=3   //使X增加1,Y除以3,并存入新值
[root@svr5~]# echo X,X,Y    //确认操作结果
49,7

环境变量RANDOM

——使用随机整数
•在/bin/bash 环境可直接使用
-每次被调用时,随机生成 0~32767之间的一个整数
(RANDOM特殊的环境变量,作用就是随机生成一个整数,每次调用的数值都不相同)
-结合 echo 命令可查看效果
[root@s~]# echo $RANDOM
24546
[root@s~]# echo $RANDOM
1926
[root@s~]# echo RANDOM,RANDOM,RANDOM,SRANDOM
10446,7516,3136

扩大随机数范围

•生成2个随机数,并计算相乘的结果
-乘积结果的范围: 0~3276732767 即 0~1073676289
-结合$[ ]表达式计算
[root@s~]# echo $[RANDOM
RANDOM]
244008
[root@s~]# echo $[RANDOMRANDOM]
178013197
[root@s~]# echo $[RANDOM
RANDOM]
184662759

减小随机数范围

•将随机数与指定的阈值相除,取余数
-比如 %1000,则求模结果的范围:0~999
-结合$[ ]表达式计算
[root@svr5 ~]#echo $[RANDOM%1000]
526
[root@svr5 ^]# echo $[RANDOM%1000]
14
[root@svr5~]#echo $[RANDOM%1000]
237

限制随机数区间

•将求模减小后的随机数与指定基值相加,取最终结果
-比如0999的随机数,再加1,则结果范围:11000
-结合$[ ]表达式计算
[root@s~]# echo $[RANDOM%1000+1]
447
[root@s~]# echo $[RANDOM%1000+1]
204
[root@s ^]# echo $[RANDOM%1000+1]
41

——整数序列

使用seq命令

•根据指定条件输出一组整数
-默认从整数1开始
-缺省的增量步长也是1
•seq命令格式
-seq 末数
-seq 首数 末数
-seq 首数 步长 末数

从1开始的一组整数

•格式:seq 末数
-默认的分隔符为换行(\n)
-选项-s 可用来自定义字符串作为分隔符
[root@svr5 ~]# seq 3    //从1~4的整数序列,每行一个过
1
2
3
[root@svr5 ~]# seq -s ’ '10    //从1~10的整数序列,以两个空格分隔
1 2 3 4 5 6 7 8 9 10

限定区间的一组整数

•格式:seq 首数末数
-默认按整数值的实际位数显示
-选项-w 可以显示等宽效果,不足的数会添加前置0
[root@s~]# seq 8 10    //从8~10的整数序列,不等宽
8
9
10
[root@s~]# seq -w 8 10    //从8~10的整数序列,(-w)加前置0等宽让宽度一致
08
09
10

—小数运算处理

数值运算的局限性

•Bash内建机制仅支持整数值运算

  • expr命令、$[ ]表达式不支持有小数的运算
    [root@s~]# expr 123 + 45.678
    expr:参数数目错误

[root@s~]# echo $[3.142]
bash: 3.14
2: syntax error: invalid arithmetic operator (error token is “.14*2”)

使用bc计算器

•多数Linux系统默认安装此工具
-支持高精度的数值运算
-直接运行bc可进入交互式运算界面,quit退出
-设置 scale=n 可约束小数位
[root@s~]# bc   //打开bc计算器程序
12.34*56.78    //提交表达式
700.66
scale=4    //将可用的小数位增加为4
12.34*56.78   //重新计算表达式
700.6652
quit    //退出计算器

bc算器的免交互

•结合管道向bc发送表达式
-多个表达式以分号分隔
-通过echo命令+管道传递要计算的表达式
[root@s~]# A=12.34
[root@s ~]# echo"$A*56.789" I bc //计算单个表达式
700.776
[root@s~]# echo “scale=4; $A*56.789;5/3”| bc //计算多个表达式
700.7762
1.6666

小数值的比较

•基本用法 - echo"数值1 比较符 数值2" | bc
-如果表达式成立,则返回的计算结果为1,否则返回0
-常见比较操作:>、>=、<、<=、==、!=
[root@s~]# A=12.34;B=56.78
[root@s~]#echo “$A <=$B”| bc    //比较A是否小于或等于B
1
[root@s~]#echo “$A>$B”|bc    //比较A是否大于或等于B
0