![如何缩短bash中的十进制输出?](https://linux22.com/image/177413/%E5%A6%82%E4%BD%95%E7%BC%A9%E7%9F%ADbash%E4%B8%AD%E7%9A%84%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BE%93%E5%87%BA%EF%BC%9F.png)
现在我正在做一项涉及高级管道的作业,其中一个问题涉及计算百分比并将其缩短到小数点后三位。我已经成功计算了百分比:
echo "$ERRORS" / "$TOTAL" \* 100 | bc -l
这给出了正确的输出:2.64905226881102814400
ERRORS 和 TOTAL 都是包含整数的环境变量。
但我真的不知道如何修改此命令以仅输出 2.649 而不是完整的数字。我知道有一种方法可以使用 bc 中的“scale”来缩短到一定数量的小数位,但我尝试过echo scale=3; "$ERRORS" / "$TOTAL" \* 100 | bc -l
,但没有成功。
我究竟做错了什么?
答案1
尝试:
$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649
反而。看看在这种情况下如何scale = 3
被输入来bc
设置比例变量的bc
,这是数字的位数它除法的基数之后,以及我们如何乘以 100前该部门。
请注意,这是截断,而不是四舍五入。例如,8 * 100 / 9 将变为 88.888,而不是 88.889。
如果您的 shell 支持浮点运算(ksh93、zsh、yash),您还可以执行以下操作:
$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649
(但请注意,在 zsh 和 ksh93 中,控制这些变量的内容至关重要,否则将构成命令注入漏洞。我们使用1e2
(浮点数 100,而100
为整数)而不是100.
ksh93 中的那样,这100.
是行不通的在用作,
十进制基数的语言环境中)。
或者你可以使用awk
:
$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649
对于 9 个中的 8 个,这两者都会为您提供 88.889%(或可能为 88,889,具体取决于区域设置)。