如何计算shell脚本中的百分比

时间:2017-06-22 09:46:53

标签: shell

我在shell代码中使用了下面的脚本行     百分比= echo "scale=2; $DP*100/$SDC" | bc 它返回.16作为输出,但我需要它为0.16

1 个答案:

答案 0 :(得分:0)

使用bc符合Posix的解决方案:

#!/bin/sh
Percent="$(echo "
  scale=2;
  a = $DP * 100 / $SDC;
  if (a > -1 && a < 0) { print "'"-0"'"; a*=-1; }
  else if (a < 1 && a > 0) print 0;
  a" | bc)"

当答案介于-1和1(不包括)但不为零时,所有这些特殊检查都是丑陋的。

让我们使用awk代替Posix兼容解决方案:

#!/bin/sh
Percent="$(echo "$DP" "$SDC" |awk '{printf "%.2f", $1 * 100 / $2}')"

Z shell可以原生地执行此操作:

#!/bin/zsh
Percent="$(printf %.2f $(( DP * 100. / SDC )) )"

(点是必要的,指示zsh使用浮点数学。)

使用字符串操作的本地Posix解决方案(假设整数输入):

#!/bin/sh
#                                    # e.g. round down   e.g. round up
#                                    # DP=1 SDC=3        DP=2 SDC=3
Percent=$(( DP * 100000 / SDC + 5))  # Percent=33338     Percent=66671
Whole=${Percent%???}                 # Whole=33          Whole=66
Percent=${Percent#$Whole}            # Percent=338       Percent=671
Percent=$Whole.${Percent%?}          # Percent=33.33     Percent=66.67

计算所需答案的1,000倍,这样我们就可以获得最终分辨率所需的所有数据到百分之一。它增加了五个,所以我们可以正确地截断千分之一的数字。然后我们将临时变量$Whole定义为截断的整数值,我们暂时将其从$Percent剥离,然后我们附加一个点和小数,不包括千分之一(我们做错了所以我们可以得到百分之一圆了。)