今天学习了一下在Shell里进行四则运算的方法。
(1)简单双括号法
用两层括号将计算式子包括起来,就可以进行计算了。
$ a=10$ ((a+=23))$ echo $a33
在双括号里,变量不需要加$符号。双括号里的计算结果是可以返回的。
$ x=23$ y=$(((x-10)*3))$ echo $y39
注意:如果要输出结果,双括号前面要加$符号。
$ for ((i=0; i<3; ++i)); do> echo $i> done012
有了上面的for循环式子,再也不用笨拙地用while计算了。 |
(2)expr命令法
用expr命令,可以完成与或非、加减乘除、大小等于与字串的计算。这里不多说,自己去man
(3)let命令
let命令的用几乎与方法(1)一样。只不过,let 后跟的是双引号括起来的表达式。表达式中的变量不需要加$符号。
let "x = x + (y / 2)" <==> (( x= x+ (y / 2) ))
$ echo $x26$ let "x += 2"$ echo $x29
与双括号方式相比,let命令没有返回结果。赋值操作在表达式内部完成。
Shell本身不支持浮点运算,如果需要进行浮点计算,可以使用下面两种方法:
(4)用bc计算器实现
$ x=8$ y=`echo "scale=6; $x*3/7" | bc`$ echo $y3.428571
解释一下,其中scale=6是在设置bc的小数点精度。其中的$x将会被shell替换成8,最后变成:
echo "scale=6; 8*3/7" | bc
可以看出,这个计算方法并不太灵活。我们把上面的命令换成:
$ y=0$ echo "scale=6; y=$x*3/7" | bc$ echo $y0
| 试图将赋值的操作放到式子里面完成,结果失败了。为什么?因为bc在对式子进行运算过程时,发现了式子中的y,则会在内部分配一块空间。所以这里的y不是shell里的y,而是bc里的。 |
注意:不要将双引号换成了单引号。因为用了单引号$x则无法被解释,作为字串带入了bc,而bc又不认识这个。
$ echo 'scale=6; $x*3/7' | bc(standard_in) 1: illegal character: $
(5)使用awk内部的计算方法。(不是很提倡)
c=$(awk 'BEGIN{print 7.01*5-4.01 }')
参考网页:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839556.html