在 Bash 中除法不起作用

在 Bash 中除法不起作用

我想计算文件中的一些信息,但除法不起作用。如果我将 改为/+-这个计算就可以正确进行。有什么想法吗?

#!/bin/sh
    FILE=/tmp/stats

    for EMPTY in $(cat $FILE |sed '1!d'); do (echo "Empty Servers $EMPTY | Empty-Servers=$EMPTY;"); done
    for SERVERS in $(cat $FILE |sed '2!d'); do (echo "Total Servers $SERVERS | Total=$SERVERS;"); done

    PERCENT=$(((EMPTY / SERVERS)*100))
    echo $PERCENT

答案1

除法确实有效,只是 shell 只处理整数。

我认为您要么想要调用类似的东西bc,然后您可以按照自己喜欢的方式进行数学运算,要么适应处理整数的含义。

您可以采取以下做法的示例:更改表达式,先乘以EMPTY100然后除以SERVERS。即$(((EMPTY * 100) / SERVERS))
(当然,这可能不如您所希望的那样精确,但它并不总是产生 0 结果。)

答案2

根据这个关联,你也需要一个$before (EMPTY / SERVERS)。因此你的脚本应该如下所示:

#!/bin/sh
FILE=/tmp/stats

for EMPTY in $(cat $FILE |sed '1!d'); do (echo "Empty Servers $EMPTY | Empty-Servers=$EMPTY;"); done
for SERVERS in $(cat $FILE |sed '2!d'); do (echo "Total Servers $SERVERS | Total=$SERVERS;"); done

PERCENT=$(($((EMPTY / SERVERS))*100))
echo $PERCENT

根据这个关联,shell 解析仅对整数除法有用,所以最好使用bc

答案3

BC 的做法是:

for PERCENT in $(echo "scale=3; ($EMPTY/$SERVERS)*100" | bc); do (echo "Percent Empty=$PERCENT;;");done

相关内容