13.4.5 使用bc做运算

前面介绍的几种算术运算都只能是基于整数的,但现实中有很多需求必须是基于浮点数进行的计算,比如说职工的工资、贷款的利率等,这就要求更高精度的计算。而Linux下的bc正是这样一款专门用于高精度计算的工具。与其说bc是一个命令或者工具,不如说它是一门语言,bc的man文件对它的描述是:“一款高精度计算语言(An arbitrary precision calculator language)”。

在Linux下使用bc最简单的方式是直接输入bc命令,回车后进入bc的交互式界面,闪烁的命令提示符表明现在可以输入表达式了。注意看以下演示中的计算:


  1. [root@localhost ~]# bc

  2. bc 1.06

  3. Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.

  4. This is free software with ABSOLUTELY NO WARRANTY.

  5. For details type `warranty'.

  6. a=9

  7. b=5

  8. a+b

  9. 14

  10. a-b

  11. 4

  12. a*b

  13. 45

  14. a/b

  15. 1

  16. #

  17. 设置显示的小数位数

  18. scale=3

  19. a/b

  20. 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已经考虑到了这种情况,所以它支持批量的处理和以管道方式处理表达式计算。比如,希望一次性处理多个计算,只需要创建一个文件,并按行写好需要计算的表达式就可以了,如下所示:


  1. [root@localhost ~]# cat cal.bc

  2. 12*34

  3. 34/12

  4. scale=3;34/12

  5. a=1;b=2;a+b

  6. #

  7. 批量计算

  8. [root@localhost ~]# cat cal.bc | bc

  9. 408

  10. 2

  11. 2.833

  12. 3


但有的时候需要在Shell程序中直接调用bc计算表达式,并将计算结果赋值给变量以参与后面的计算或判断。这里给出了一个求和的例子,如果想让脚本变得更灵活,也可以使用read命令动态地给变量赋值。


  1. [root@localhost ~]# cat bc.sh

  2. #!/bin/bash

  3. NUM01=10

  4. NUM02=15

  5. TOTAL=$(echo "$NUM01+$NUM02" | bc)

  6. echo $TOTAL

  7. [root@localhost ~]# bash bc.sh

  8. 25


关于bc的更多用法可以参考man文件。正如本节一开始所说,bc更是一门语言,它有和常规编程语言一样的支持顺序执行、判断、循环等运行机制,还支持自定义函数等,功能非常强大,有兴趣的读者可以深入了解。