在脚本和浮点部门

我想在我的脚本中执行以下操作:

1 - ((m - 20) / 34) 

我想把这个操作的结果分配给另一个variables。 我想我的脚本使用浮点math。 例如,对于m = 34:

 results = 1 - ((34 - 20) / 34) == 0.588 

你可以使用bc计算器。 如果你设置从默认值0开始的默认值,它将使用小数(不是二进制浮点数)进行任意的精确math运算:

 $ m=34 $ bc <<< "scale = 10; 1 - (($m - 20) / 34)" .5882352942 

-l选项将加载标准的math库,默认缩放比例为20:

 $ bc -l <<< "1 - (($m - 20) / 34)" .58823529411764705883 

然后,您可以使用printf格式化输出,如果您select:

 printf "%.3f\n" "$(bc -l ...)" 

Bash不会做浮点math。 你可以用awk或者bc来处理这个。 这里是一个awk的例子:

 $ m=34; awk -vm=$m 'BEGIN { print 1 - ((m - 20) / 34) }' 0.588235 

将输出分配给一个variables:

 var=$(awk -vm=$m 'BEGIN { print 1 - ((m - 20) / 34) }') 

教bash例如整数除法与浮点结果:

 #!/bin/bash div () # Arguments: dividend and divisor { if [ $2 -eq 0 ]; then echo division by 0; exit; fi local p=12 # precision local c=${c:-0} # precision counter local d=. # decimal separator local r=$(($1/$2)); echo -n $r # result of division local m=$(($r*$2)) [ $c -eq 0 ] && [ $m -ne $1 ] && echo -n $d [ $1 -eq $m ] || [ $c -eq $p ] && return local e=$(($1-$m)) let c=c+1 div $(($e*10)) $2 } result=$(div 1080 633) # write to variable echo $result result=$(div 7 34) echo $result result=$(div 8 32) echo $result result=$(div 246891510 2) echo $result result=$(div 5000000 177) echo $result 

输出:

  1.706161137440 0.205882352941 0.25 123445755 28248.587570621468 
 echo $a/$b|bc -l 

给出结果。

例:

 read ab echo $a/$b|bc -l 

input一个&b值为10 3,得到3.3333333333

如果你想存储在另一个variables的值,然后使用代码

 read ab c=`echo $a/$b|bc -l` echo $c 

它也给出了与上面相同的结果。 尝试一下…

使用此脚本与喜欢的编辑器打开此文件,如:

 $ sudo vim /usr/bin/div 

然后粘贴这个代码:

 #!/bin/bash # Author: Danial Rikhteh Garan (danial.rikhtehgaran@gmail.com) if [[ -z "$1" ]] || [[ -z "$2" ]]; then echo "Please input two number" echo "for 100/50 use: div 10 50" exit 1; fi div=$(echo "$1/$2" | bc -l); echo 0$div | sed 's/[0]*$//g' 

现在chmod到755:

 $ sudo chmod 755 /usr/bin/div 

现在使用它:

 $ div 5 100 0.05 

在你的脚本中你可以使用这个:

 var=$(div 5 100); echo "$var"