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

Shell中的算术运算

示例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
仿制代码

Shell中的算术运算

示例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
仿制代码

Shell中的算术运算

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
仿制代码

Shell中的算术运算
示例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
仿制代码

Shell中的算术运算

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
仿制代码

Shell中的算术运算

Shell中的算术运算

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 ~]#
仿制代码

Shell中的算术运算

示例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
仿制代码

Shell中的算术运算

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
仿制代码

Shell中的算术运算

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++     //i1
[root@localhost ~]# echo $i
2
[root@localhost ~]# let i--    //i1
[root@localhost ~]# echo $i
1
[root@localhost ~]# let i+=2    //i2
[root@localhost ~]# echo $i
3
[root@localhost ~]# let i*=3;echo $i    //i3
9
[root@localhost ~]# let i/=3;echo $i    //i除以3 
3
[root@localhost ~]# let i%=2;echo $i    //i除以2后取余数
1
仿制代码

Shell中的算术运算

示例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
仿制代码

Shell中的算术运算

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
仿制代码

Shell中的算术运算

Shell中的算术运算

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