Shell答应在某些情况下对算术表达式进行求值,比如:let和declare 内置指令,(( ))复合指令和算术扩展。求值以固定宽度的整数进行,不查看溢出。
注意:默认情况下bash只支撑整数运算,不支撑小数运算。
1 运算表达式
运算表达式:
(1) expr 变量1 运算符 变量2 [运算符 变量3]...
(2) let var=算术表达式
(3) ((var=算术表达式)),和上一个等价
(4) var=$[算术表达式]
(5) var=$((算术表达式))
(6) var=$(expr arg1 arg2 arg3 ...)
(7) var= `expr arg1 arg2 arg3 ...`
(8) echo '算术表达式' | bc
运算符:
- 加法 +
- 减法 –
- 乘法 \ *
- 除法 /
- 取余 (取模)%
运算规律:
- 加法: num1 + num2
- 减法:num1 – num2
- 乘法:num1 \ * num2
- 整除:num1 / num2
- 取余(求模):num1 % num2 (求 num1 除以 num2 的余数)
2 运算演示
2.1 expr
expr指令是一个手艺指令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
- 变量和运算符之间,要用空格离隔。
- 用反斜杠 \ 放在 shell 特定的字符前面;
- 对包括空格和其他特殊字符的字符串要用引号括起来
示例1:
[root@localhost ~]# expr 4 + 3
7
[root@localhost ~]# expr 4 - 3
1
[root@localhost ~]# expr 4 * 3 //乘号前要加反斜杠
12
[root@localhost ~]# expr 10 / 2
5
[root@localhost ~]# expr 10 % 3 //10除以3取余数
1
[root@localhost ~]# expr 1 + 2 \* 3 //先乘除,再加减
7
示例2:
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# expr $a + $b
3
[root@localhost ~]# expr $a - $b
-1
[root@localhost ~]# expr $a * $b
2
仿制代码
示例3:
$( )和反撇号,能够调用指令的执行成果。
[root@localhost ~]# echo $(expr 3 + 4 - 1)
6
[root@localhost ~]# i=$(expr 2 + 5 * 3)
[root@localhost ~]# echo $i
17
[root@localhost ~]# m=`expr 1 + 2`
[root@localhost ~]# echo $m
3
仿制代码
2.2 let 和 (( ))
let var=算术表达式 和 ((var=算术表达式)) 效果等同。
两者都不返回成果,需求借助echo指令。
示例1:
[root@localhost ~]# let y=1+2
[root@localhost ~]# echo $y
3
[root@localhost ~]# ((z=1+2))
[root@localhost ~]# echo $z
3
仿制代码
示例2:
[root@localhost ~]# a=30
[root@localhost ~]# b=20
[root@localhost ~]# let cc=$a+$b //加法
[root@localhost ~]# echo $cc
50
[root@localhost ~]# let dd=$a-$b //减法
[root@localhost ~]# echo $dd
10
[root@localhost ~]# let ee=$a*$b //乘法
[root@localhost ~]# echo $ee
600
[root@localhost ~]# let ff=$a%$b //取余数
[root@localhost ~]# echo $ff
10
[root@localhost ~]# let gg=$a/$b //整除的商
[root@localhost ~]# echo $gg
1
仿制代码
2.3$[ ]
和 $(( ))
$[ ]
和 $(( ))
效果相同,且都支撑对变量进行运算。
[root@localhost ~]# echo $[10+3]
13
[root@localhost ~]# echo $[10-3]
7
[root@localhost ~]# echo $[10*3]
30
[root@localhost ~]# echo $[10/3]
3
[root@localhost ~]# echo $[10%3]
1
[root@localhost ~]# a=2
[root@localhost ~]# b=5
[root@localhost ~]# echo $[a+b]
7
[root@localhost ~]# echo $[a*b]
10
[root@localhost ~]# echo $((a+b))
7
[root@localhost ~]# echo $((a*b))
10
仿制代码
3 小数运算(浮点数运算)
3.1 运用bc计算器
Bash内置了对整数运算的支撑,但是并不支撑浮点运算,而 bc 计算器能够很方便的进行浮点运算。
- 支撑交互式和非交互式两种方法。
- 运用scale=n能够指定精度,即小数点后的位数。要写在算术表达式之前。
- 非交互式运算,运用 echo “算术表达式” | bc。 多个算术表达式之间用分号离隔,例如:echo ‘1+1;2+2″ | bc。
示例1:
交互式运算
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation,
Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1.1*1.1 //输入1.1*1.1,敲回车
1.2 //返回成果
3.3+3.3
6.6
scale=2 //指定精度,小数点后显现2位
1.1*1.1 //输入1.1*1.1,敲回车
1.21 //显现2位小数
quit //退出计算器
[root@localhost ~]#
仿制代码
示例2:
非交互式运算,运用:echo “算术表达式” | bc。
运用scale指定精度时,要写在算术表达式之前。
[root@localhost ~]# echo "1.1+1.1" |bc
2.2
[root@localhost ~]# echo "2+2.2;3.3+3.3" |bc //多个算术表达式之间用分号离隔
4.2
6.6
[root@localhost ~]# echo "scale=2;1.5*1.5;3.6*3.6" |bc //scale=2指定小数点后显现2位
2.25
12.96
[root@localhost ~]# echo "scale=3;10/2" |bc //scale=3指定小数点后显现3位
5.000
仿制代码
3.2 运用awk指令
运用awk进行浮点数的运算,运算成果最多显现6个有用数字。
格局:awk “BEGIN{print 算术表达式}”
示例:
[root@localhost ~]# awk "BEGIN{print 6.5+3.4}"
9.9
[root@localhost ~]# awk "BEGIN{print 6.5-3.4}"
3.1
[root@localhost ~]# awk "BEGIN{print 6.5*3.4}"
22.1
[root@localhost ~]# awk "BEGIN{print 6.5/3.4}"
1.91176
[root@localhost ~]# awk "BEGIN{print (6.5-3.4)*7}" //混合运算
21.7
仿制代码
4 变量的自增和自减
简写表达式 | 等同于 |
---|---|
let i++ | i=$[$i+1] |
let i– | i=$[$i-1] |
let i+=2 | i=$[$i+2] |
let i-=2 | i=$[$i-2] |
let i*=2 | i=$[$i*2] |
let i/=2 | i=$[$i/2] |
let i%=2 | i=$[$i%2] |
示例1:
运用分号,能够在一行执行多个指令。
[root@localhost ~]# i=1
[root@localhost ~]# let i++ //i加1
[root@localhost ~]# echo $i
2
[root@localhost ~]# let i-- //i减1
[root@localhost ~]# echo $i
1
[root@localhost ~]# let i+=2 //i加2
[root@localhost ~]# echo $i
3
[root@localhost ~]# let i*=3;echo $i //i乘3
9
[root@localhost ~]# let i/=3;echo $i //i除以3
3
[root@localhost ~]# let i%=2;echo $i //i除以2后取余数
1
仿制代码
示例2:
比较 i++ 和 ++i:
i++ 是先赋值再自增; ++i 是自增后再赋值。
[root@localhost ~]# i=1;let i++; echo $i
2
[root@localhost ~]# i=1;let ++i; echo $i
2
[root@localhost ~]# i=100;let z=i++; echo $i $z //i++是先赋值给z后再自增
101 100
[root@localhost ~]# i=100;let z=++i; echo $i $z //++i是先自增后再赋值给z
101 101
仿制代码
5 生成随机数
运用 echo $[RANDOM%n]
能够生成随机数,n为正整数。
对 n 取余数的规模是 [0,n-1]。
-
echo $[RANDOM%10]
生成的随机数规模为 [0,9] - 假如期望包括10的话,能够
echo $[RANDOM%11]
,则随机数规模为 [0,10]。 - 假如期望随机数规模都为正整数,即不包括0的话,能够
echo $[RANDOM%10+1]
,此刻随机数规模为[1,10]。
# 要求生成20以内的随机数,不包括20
[root@localhost ~]# echo $[RANDOM % 20]
12
[root@localhost ~]# echo $[RANDOM % 20]
0
[root@localhost ~]# echo $[RANDOM % 20]
7
# 要求生成15以内的正整数,包括15
[root@localhost ~]# echo $[RANDOM%15+1]
9
[root@localhost ~]# echo $[RANDOM%15+1]
14
[root@localhost ~]# echo $[RANDOM%15+1]
8
仿制代码
6 总结
常用的运算表达式:
# 常用的四个运算表达式:
i=$(expr 12 * 5 )
i=$((12*5))
i=$[12*5]
let i=12*5
# 变量的自增和自减等
let i++ 等同于 i=$[$i+1]
let i-- 等同于 i=$[$i-1]
let i+=2 等同于 i=$[$i+2]
let i-=2 等同于 i=$[$i-2]
let i/=2 等同于 i=$[$i/2]
# 生成随机数
echo $[RANDOM%n] //生成n以内的随机数,不包括n