在脚本的编写过程当中,最经常使用的恐怕就是$(())了。它能够执行多种基本算术运算。这个表达式很是有用,特别是增长计数器时;而且它支持+ - * / %运算,不过不是全部的整数和小数都行。好比,下面的命令返回的是0,而不是0.5: shell
echo $((1/2))
因此当一个计算结果须要更高的精度时,这也就意味着你接受了一个挑战。在命令行下没有几个好用的计算程序。除了,好比说,bc,一个不多有Unix用户学习的怪异程序。bc程序会把本身看成一个任意精度的计算器,它使用隐晦的错误信息追溯到Unix的开头,而且彻底没有提示,并且,一旦你使用它,它就假定你已经很是明了你正在作什么。但这一切都没有关系,咱们能够搞定。 学习
代码: ui
#!/bin/sh # scriptbc.sh -- 返回计算结果的'bc'封装器 if [ $1 = "-p" ]; then precision=$2 shift 2 else precision=2 # 默认为小数点后2位 fi bc -q << EOF scale=$precision $* quit EOF exit 0
脚本如何工做:
这个脚本使用了here document方法,这个方法颇有用。标记符号<<容许你在脚本中包含后续输入,这些后续的输入就好像直接从输入流中得到的同样,在本例中,也就是容许用一种简单的机制让bc程序来处理命令。这一样也是咱们第一次阐述:在一个脚本内,如何利用命令的参数来加强一个命令的灵活性。这里,若是调用脚本时用了-p选项,它就会容许你给出一个你想要的精度。若是没有给出,程序就默认使用scale=2。 spa
当使用bc时,明白长度(length)和精度(scale)之间的区别尤为重要。对于bc来讲,length是数字中的总的个数,而scale则是小数点后的数字个数。所以,10.25的length是4,scale是2,而3.14159的length是6,scale是5。 命令行
默认状况下,bc的length是一个变量,但因为它的scale是0,因此若是不加任何设置的话,bc的工做方式和$(())看起来如出一辙。幸运的是,若是你在bc中设置了scale的话,你就会发现它有许多隐藏的力量,好比: code
bc #命令行上键入bc bc 1.06 #输出的bc版本 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. #系统信息 This is free software with ABSOLUTELY NO WARRANTY. #系统信心 For details type `warranty'. #系统信息 scale=10 #设置精度 (2002-1962)*365 #给出计算表达式 #上面算式的结果 /7 #再给出一个算式 .7142857142 #上面算式的结果 quit # 退出bc程序
为了容许从命令行访问bc,封装脚本必须禁止Copyright内容的输出。就算他们的输入不是来自终端(标准输入),大部分bc版本也知道应该禁止头部Copyright的输出。封装器还将scale设置为一个明确的值,给bc程序传了表达式,而后使用quit命令退出。 ip
运行脚本:
要运行这个脚本,只要给脚本程序一个数学表达式做为参数便可。 ci
运行结果: 数学
scriptbc.sh 14600/7 2085.71 scriptbc.sh -p 10 14600/7 2085.7142857142