Shell脚本处理浮点数的运算和比较实例
通过top命令看到的进程的CPU、内存的使用率的百分比是一个浮点数,我需要在写脚本时对其进行处理,所以学习了一些,总结如下。
其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。
1.用bc来处理计算(包括整型和浮点计算)
bc–Anarbitraryprecisioncalculatorlanguage
(1).通常在Bash脚本中使用bc的范例格式为:
variable=$(echo“OPTIONS;OPERATIONS”|bc[options])即:echo“[选项];操作”|bc[选项]
(2).在下面的脚本中,提到在第一个选项中,“scale”变量表示输出中小数点后的精度,可以用于控制计算结果的精度;“ibase”和“obase”分别表示输入和输出数据的进制,可以用于数值进制的转换。
(3).浮点数的比较,如“if[$(echo"$big>$small"|bc)-eq1]”,将一个逻辑判断式用管道传给bc。如果结果为真则输出1,否则输出0,然后就可以利用这个结果进行进一步的操作了。
(4).bc本来是用一个文件作为输入进行计算的(后面也有演示),所以可以将很复杂的计算写到文件中,然后让bc工具去处理到处计算结果。
注意一下:在使用除法运算符/时,要想保留小数,需要自己设置scale,否则默认时scale,小数点后时0位。
2.使用awk来处理浮点计算和浮点数比较
不解释过多了,写了示例脚本如下,看懂了这个就会知道怎么处理浮点计算和浮点数比较了。
#!/bin/bash #author:Jay<smile665@gmail.com> #someexamplesforplayingwithfloatingpointnumber. #basicusageof'bc'toolinBash. a=3.33 b=3.3 c=$(echo"$a+$b"|bc) d=$(echo"$a*$b"|bc) e=$(echo"scale=5;$a/$b"|bc) echo"c=a+b=$a+$b=$c" echo"d=a*b=$a*$b=$d" echo"e=a/b=$a/$b=$e" #"-l"parameterfor'bc'meansusingmathlibrary. pi=$(echo"scale=10;4*a(1)"|bc-l) s=$(echo"s($pi/6)"|bc-l) echo"pi=$pi" echo"s=sin(pi/6)=$s" #usemoreoptionsof'bc'tool r=$(echo'ibase=10;obase=2;15+16'|bc) echo"binaryof(15+16)is$r" #comparisonforfloatingpointnumbersusing'bc' big=100 small=99.9 if[$(echo"$big>$small"|bc)-eq1];then echo"$bigisbiggerthan$small" fi #dealwithfloatingpointnumberswith'awk'language echo$(awk-vx=10-vy=2.5'BEGIN{printf"10/2.5=%.2f\n",x/y}') v=$(echo$big$small|awk'{printf"%0.8f\n",$1/$2}') echo"$big/$small=$v" echo$big$small|awk'{if($1>$2){printf"%f>%f\n",$1,$2}else{printf"%f<%f\n",$1,$2}}'
执行的结果如下:
master@jay-linux:~/workspace/mygit/shell/sh2012$./floating-point.sh c=a+b=3.33+3.3=6.63 d=a*b=3.33*3.3=10.98 e=a/b=3.33/3.3=1.00909 pi=3.1415926532 s=sin(pi/6)=.49999999994373819220 binaryof(15+16)is11111 100isbiggerthan99.9 10/2.5=4.00 100/99.9=1.00100100 100.000000>99.900000
另外,bc处理一个文件中的计算逻辑,演示如下:
master@jay-linux:~/workspace/mygit/shell/sh2012$cattemp.bc 3+8 3/8 scale=2;3/8 master@jay-linux:~/workspace/mygit/shell/sh2012$bc-qtemp.bc 11 0 .37
bc是强大的工具,请“manbc”查看详情;同样,请“manawk”。