0

我的 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,请帮助我谢谢

4

4 回答 4

2

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
于 2019-08-08T13:58:54.987 回答
2

您应该使用 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

请注意,它可以防止除以零错误。

于 2019-08-08T14:04:21.957 回答
1

请注意,在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更明确:/返回“整数值参数”的“整数除法”的结果。

于 2019-08-08T14:21:30.333 回答
1

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
于 2019-08-08T14:41:53.117 回答