13.4.5 使用bc做运算
前面介绍的几种算术运算都只能是基于整数的,但现实中有很多需求必须是基于浮点数进行的计算,比如说职工的工资、贷款的利率等,这就要求更高精度的计算。而Linux下的bc正是这样一款专门用于高精度计算的工具。与其说bc是一个命令或者工具,不如说它是一门语言,bc的man文件对它的描述是:“一款高精度计算语言(An arbitrary precision calculator language)”。
在Linux下使用bc最简单的方式是直接输入bc命令,回车后进入bc的交互式界面,闪烁的命令提示符表明现在可以输入表达式了。注意看以下演示中的计算:
- [root@localhost ~]# bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
a=9
b=5
a+b
14
a-b
4
a*b
45
a/b
1
#
设置显示的小数位数
scale=3
a/b
1.800
在上面的示例中,先是定义了a=9,b=5,然后进行了加减乘除计算,前面3次计算结果都是对的,唯独最后的除法计算不对:bc不是支持浮点计算吗?为什么看起来又是整数计算了?
事实上,默认情况下bc并不显示小数部分,必须设置要显示的小数位数。这可以通过设置scale做到,本例中设置为3后再运行除法运算结果就正确了。
除此之外,bc还支持逻辑运算、比较运算。
#
比较运算,真为1
,假为0
2>1
1
2<1
0
1==1
1
#
逻辑运算,真为1
,假为0
1&&2
1
1&&0
0
1||0
1
1||2
1
!0
1
上面介绍了bc的基本用法,但是在Shell编程中,往往只需要调用bc的处理结果而不会进入bc的交互界面。好在bc已经考虑到了这种情况,所以它支持批量的处理和以管道方式处理表达式计算。比如,希望一次性处理多个计算,只需要创建一个文件,并按行写好需要计算的表达式就可以了,如下所示:
- [root@localhost ~]# cat cal.bc
12*34
34/12
scale=3;34/12
a=1;b=2;a+b
#
批量计算
[root@localhost ~]# cat cal.bc | bc
408
2
2.833
3
但有的时候需要在Shell程序中直接调用bc计算表达式,并将计算结果赋值给变量以参与后面的计算或判断。这里给出了一个求和的例子,如果想让脚本变得更灵活,也可以使用read命令动态地给变量赋值。
- [root@localhost ~]# cat bc.sh
#!/bin/bash
NUM01=10
NUM02=15
TOTAL=$(echo "$NUM01+$NUM02" | bc)
echo $TOTAL
[root@localhost ~]# bash bc.sh
25
关于bc的更多用法可以参考man文件。正如本节一开始所说,bc更是一门语言,它有和常规编程语言一样的支持顺序执行、判断、循环等运行机制,还支持自定义函数等,功能非常强大,有兴趣的读者可以深入了解。