我的 shell 脚本看起来像这样,
sOneCount =5
sZeroCount=12
aa=`expr $sOneCount / $sZeroCount`
successRate=`expr $aa \* 100
因为 5/12 的结果是 0.416,然后是 0.416*100,它应该给出 41.6,但我得到的“successRate”为 0。它对浮点值进行了四舍五入。
我希望最终结果应该是这样的 41,请帮助我谢谢
我的 shell 脚本看起来像这样,
sOneCount =5
sZeroCount=12
aa=`expr $sOneCount / $sZeroCount`
successRate=`expr $aa \* 100
因为 5/12 的结果是 0.416,然后是 0.416*100,它应该给出 41.6,但我得到的“successRate”为 0。它对浮点值进行了四舍五入。
我希望最终结果应该是这样的 41,请帮助我谢谢
Bash,可能还有其他类似的 shell,不支持浮点运算:
评估以固定宽度整数完成,不检查溢出
http://man7.org/linux/man-pages/man1/bash.1.html#ARITHMETIC_EVALUATION
您可以bc
改用,启用 mathlib 操作:
$ successRate=$(echo "${sOneCount} / ${sZeroCount} * 100" | bc -l)
$ echo ${successRate}
41.66666666666666666600
您应该使用 awk 而不是 shell 进行计算(可能您也在做其他任何事情,但我们看不到脚本的其余部分):
$ cat tst.sh
#!/bin/env bash
sOneCount=$1
sZeroCount=$2
awk -v sOneCount="$sOneCount" -v sZeroCount="$sZeroCount" 'BEGIN{
aa = (sZeroCount == 0 ? 0 : sOneCount / sZeroCount)
successRate = aa * 100
print successRate
printf "%d\n", successRate
}'
$ ./tst.sh 5 12
41.6667
41
$ ./tst.sh 5 0
0
0
请注意,它可以防止除以零错误。
请注意,在expr
手册页(1)中,/
运算符为您提供了quotient,这意味着这是仅整数运算。
您可以通过先将分子乘以 100 来获得积分成功率
$ successRate=$( expr 100 \* "$sOneCount" / "$sZeroCount" )
$ echo "$successRate"
41
或者,在 bash 中,您不需要调用 expr - 使用内置的算术表达式语法:
$ successRate=$(( 100 * sOneCount / sZeroCount ))
$ echo "$successRate"
41
(1):我的 Mac 上的 BSD 手册页expr
更明确:/
返回“整数值参数”的“整数除法”的结果。
awk
对于大多数基本情况,您可以轻松编写自己的计算器/评估
例如:
$ eval() { awk "BEGIN {print $1}"; }
$ x=4; y=7;
$ eval "$x/$y"
0.571429
$ rate=$(eval "$x/$y")
$ eval "$rate*100"
57.1429
或者,稍作改动可以接受更多参数
$ eval() { awk "BEGIN {print $*}"; }
$ eval "$x" / "$y" "*" 100
57.1429