一、整数运算操作
基本运算类别
a.四则运算
加法:num1+num2
减法:num1-num2
乘法:num1*num2
整除:num1/num2
b.取余数运算
求模:num1%num2
I. 计算工具
1.使用expr命令工具
格式:expr 整数1 运算符 整数2 .. ..
乘法操作应采用\*转义,避免被作为Shell通配符
运算符和整数之间必须有空格
整数值可以有变量提供,计算结果直接显示在屏幕上
类型 | 运算符 | 示例 |
---|---|---|
加法 | + | expr 43 + 21 ; expr $X + $Y |
减法 | - | expr 43 - 21 ; expr $X - $Y |
乘法 | \* | expr 43 \* 21 ; expr $X \* $Y |
除法 | / | expr 43 / 21 ; expr $X / $Y |
取余数 | % | expr 43 % 21 ; expr $X % $Y |
示例:
$ X=48;Y=21
$ expr X + 12
expr: 非数值参数
$ expr $X + 100 - $Y \* 2 / 7 //混合运算,乘除优先
142
$ expr $X / $Y //除法,取整数
2
$ expr $X % $Y //除法,取余数
6
$ expr 12 * 13
expr: 语法错误
2.算式替换
使用$[]表达式或$(())表达式
格式:$[整数1 运算符 整数2 .. ..]
乘法操作无需转义,运算符两侧可以无空格,引用变量可省略$符号
计算结果替换表达式本身,结合echo命令才能显示到屏幕上
$ X=48;Y=21
$ echo $[X+100-Y*2/7] //混合运算,乘除优先
142
$ echo $[X/Y] //除法,取整数
2
$ echo $[X%Y] //除法,取余数
6
$ echo $[10**3] //$[]表达式还支持乘法运算
1000
$ echo $((X-21)),$((X*21))
27,1008
3.整数运算实例
1)识别一个整数是奇数还是偶数
取与2相除的余数,结果为0表示该整数为偶数,否则为奇数
2)识别一个整数是否为7的倍数
取与7相除的余数,结果为0表示该整数是7的倍数,否则不是
$ X=48;Y=21
$ echo $[X%2],$[Y%2]
0,1 //X的值为偶数,Y的值为奇数
$ echo $[X%7],$[Y%7]
6,0 //Y的值是7的倍数,X的值不是
4.整数变量的自增处理
1)自增表达式
适用于更改单个变量的值
先运算,将运算结果保存到这个变量
后取值,以这个变量的新值作为整个表达式的值
运算类别 | 对应的表达式 | 应用示例 |
---|---|---|
加法 | 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
$ X=48;Y=21
$ echo $[++X],$[--Y] //先保存运算结果,再取值
49,20
$ echo $X,$Y
49,20
2)++i与i++的区别
a.运算符在前,++i或--i
先运算,将运算结果保存到这个变量
后取值,调用这个变量的新值
$ X=48;echo $[++X],$X
49,49 //先运算,后取值
b.运算符在后,i++或i--
先取值,调用这个变量的旧值
先取值,调用这个变量的旧值
后运算,将运算结果保存到这个变量
$ X=48;echo $[X++],$X
48,49 //先取值,后运算
5.使用let命令操作变量
操作变量值运算,只运算,不输出结果,如有需要则保存新结果
1)适用于不需要输出的情况,比如循环次数记录
2)若要查看结果,可结合echo命令
$ X=48;Y=21
$ let X++,Y/3 //使X增加1,Y除以3,并存入新值
$ echo $X,$Y //确认操作结果
49,7
$ i=42
$ let i++;echo $i
43
$ let i-=7;echo $i
36
$ i = 12
$ expr $i + 1
13
$ echo $i
12
6.使用随机整数
1)环境变量RANDOM
在/bin/bash环境可直接使用
每次被调用时,随机生成0~32767之间的一个整数
结合echo命令可查看效果
$ echo $RANDOM
24846
$ echo $RANDOM
1296
$ echo $RANDOM,$RANDOM,$RANDOM
10224,8325,2530
2)扩大随机数范围
生成2个随机数,并计算相乘的结果
乘积结果的范围:0~32767*32767即0~1073676289
结合$[]表达式计算
$ echo $[RANDOM*RANDOM]
2240002
$ echo $[RANDOM*RANDOM]
128939216
$ echo $[RANDOM*RANDOM]
180268324
3)减小随机数范围
将随机数与指定的阀值相除,取余数
比如%1000,则求模结果的范围:0~999
结合$[]表达式计算
$ echo $[RANDOM%1000]
246
$ echo $[RANDOM%1000]
18
$ echo $[RANDOM%1000]
632
7.整数序列
1)使用seq命令;根据指定条件输出一组整数
默认从整数1开始;缺省的增量不长也是1
seq命令格式
seq 末数
seq 首数 末数
seq 首数 步长 末数
e.g.从1开始的一组整数
格式:seq 末数
默认的分隔符是换行(\n)
选项-s可用来自定义字符串作为分隔符
$ seq 4 //从1~4的整数序列,每行一个
1
2
3
4
$ seq -s' ' 10 //从1~10的整数序列,以两个空格分隔
1 2 3 4 5 6 7 8 9 10
2)限定区间的一组整数
格式:seq 首数 末数
默认按整数值的实际位数显示
选项-w可以显示等宽效果,不足的数会添加前置0
$ seq 8 10 //从8~10的整数序列,不等宽
8
9
10
$ seq -w 8 10 //从8~10的整数序列,加前置0等宽
08
09
10
3)限定区间及步长
格式:seq 首数 步长 末数
$ seq 10 20 50 //从10~50的整数序列,步长为20
10
30
50
$ seq -w -s ' ' 0 50 500 //从0~500的整数序列,步长为50
二、小数运算处理
1.数值运算的局限性
- Bash内建机制仅支持整数值运算
- expr命令、$[]表达式 不支持有小数的运算
$ expr 123 + 45.678
expr:参数数目错误
$ echo $[3.14*2]
-bash:3.14*2:syntax error:invalid arithmetic operator (error token is ".14*2")
2.使用bc计算器
多数Linux系统默认安装此工具
1)支持高精度的数值运算
2)直接运行bc可进入交互式运算界面,quit退出
3)设置scale=n可约束小数位
$ bc //打开bc计算器程序
12.34*56.78 //提交表达式
700.66
scale=4 //将可用的小数位增加为4
12.34*56.78 //重新计算表达式
700.6652
quit //退出计算器
$
3.结合管道向bc发送表达式
- 多个表达式以分号分隔
- 通过echo命令+管道传递要计算的表达式
$ A=12.34
$ echo "$A*56.789" " bc //计算单个表达式
$ echo "scale=4;$A*56.789;5/3" | bc //计算多个表达式
700.7762
1.6666
4.小数值的比较(应用)
基本用法
echo "数值1 比较符 数值2" | bc
如果表达式成立,则返回的计算结果为1,否则返回0
常见比较操作:> >= < <= == !=
$ A=12.34;B=56.78
$ echo "$A<=$B" | bc //比较A是否小于或等于B
1
$ echo "$A>$B" | bc //比较A是否大于B
0