算术运算不是Shell语言的长项,Shell只提供了简单的整数运算,如果要在Shell下做浮点数运算,需要使用外部工具如bc。
1. 整数运算
Shell的整数运算符有:
+ 对两个变量做加法 - 对两个变量做减法 * 对两个变量做乘法 / 对两个变量做除法 ** 对两个变量做幂运算 % 取模运算,第一个变量除以第二个变量求余数 += 加等于,在自身基础上加第二个变量 -= 减等于,在第一个变量的基础上减去第二个变量 *= 乘等于,在第一个变量的基础上乘以第二个变量 /= 除等于,在第一个变量的基础上除以第二个变量 %= 取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量 ++ 自加1 -- 自减1
Bash有4种方法可以做整数运算,expr命令、let命令、(( ))和$[ ]。
(1)expr
expr后面跟的是运算表达式,运算返回值可以用反引号``引用。另外,expr后面的算术表达式中运算符两侧应该有空格,其中的乘法运算符(*)前需有转义符(\),因为Shell中的*是通配符。
[peter@ibi98 shell]$ expr 2 + 3 5 [peter@ibi98 shell]$ expr 3 \* 5 15 [peter@ibi98 shell]$ expr 5 / 2 2 [peter@ibi98 shell]$ sum=`expr 2 + 3` [peter@ibi98 shell]$ echo $sum 5
Bash的除法运算的结果只取整数部分。
(2)let
与expr不同的是,let后跟的是赋值表达式:
[peter@ibi98 shell]$ let sum=4+5 [peter@ibi98 shell]$ echo $sum 9 [peter@ibi98 shell]$ let product=3*5 [peter@ibi98 shell]$ echo $product 15 [peter@ibi98 shell]$ let a=5/3 [peter@ibi98 shell]$ echo $a 1
let里的*前不需要转义符。
(3)(( ))
(( ))返回表达式运算结果,前面加$引用后可以给变量赋值或直接用echo输出。表达式中的运算符前后可以有空格也可以没有,*前不需要转义符。
[peter@ibi98 shell]$ a=$((5+4)) [peter@ibi98 shell]$ echo $a 9 [peter@ibi98 shell]$ a=$((5*4)) [peter@ibi98 shell]$ echo $a 20 [peter@ibi98 shell]$ echo $((10/2)) 5 [peter@ibi98 ~]$ i=0 [peter@ibi98 ~]$ ((i++)) [peter@ibi98 ~]$ echo $i 1
(4)$[ ]
$[ ]的用法与$(( ))类似,但表示整数运算时前面的$不能少,单独的[ ]表示条件测试:
[peter@ibi98 shell]$ a=$[2*3] [peter@ibi98 shell]$ echo $a 6 [peter@ibi98 shell]$ echo $[10/2] 5
2. 非整数运算
Bash本身并不提供非整数运算。如果要进行浮点数运算,需要使用外部的工具,常用的是bc。bc可以在管道中使用,也可以用-i选项进入交互模式。
[peter@ibi98 shell]$ echo "scale=4;10/3" |bc 3.3333 [peter@ibi98 shell]$ bc -i 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'. 2*3 #输入 6 scale=3 #输入 5/3 #输入 1.666