通过命令行参数计算平均值

通过命令行参数计算平均值

任务是如果输入数字:

4
1
2
9
8

输出=(系列中除第一个数字之外的所有数字之和)/系列中的第一个数字那么输出平均值应为1+2+9+8/(first_number_in series)=20/4=5

我尝试过以下代码,但无法完成任务。如果有人能指出错误,我将不胜感激。

#!/bin/bash
sum=0
count=1
for x in $*
do
    if [ $count -eq 1 ]
    then
        p=$x
    else
        sum=$(($sum + $x))
    fi
    ((count++))
done
echo "scale=3;$sum/$p" | bc

答案1

由于您需要浮点计算,因此无论如何您最终都会使用 bc 或 awk。为什么不使用 awk 来解决整个问题呢?这是一个仅适用于 Awk 的解决方案,我使用 n 表示分子,d 表示分母:

$ printf "4\n1\n2\n9\n8\n" | awk '{if (NR == 1) {d = $0}; if (NR != 1) {n += $0}} END{printf "%.03f\n", n/(d*1.0)}'
5.000

答案2

一个简单的 POSIX 解决方案:

average() { printf '%s\n' 'scale=2' "($*)/$#" | tr ' ' + | bc;}

然后像这样运行它:

average 4 1 2 9 8

输出:4.80

答案3

您没有说这些数字是在标准输入中提供给脚本的。

为此,这段代码将起作用:

#!/bin/bash
readarray -t x
count="${x[0]}" ; unset x[0]
for y in ${x[@]}; do (( sum+=y )); done
a="$(echo "scale=8; $sum/$count" | bc)"
LC_ALL=C printf '%0.3f\n' "$a"

测试如下:

$ printf '%s\n' 4 1 2 9 8 | ./script
5.000
$ printf '%s\n' 6 1 2 9 8 13 25 | ./script
9.667

答案4

您将第一个数字包含在总和中,并且写了一个错误的条件:

if [ count -eq "1" ]

代替

if [ $count -eq 1 ]

$运算符允许您访问变量,并且您使用 1 作为字符串而不是整数。

#!/bin/bash
read n
p=$n
sum=0
count=1
while [ $count -le $p ]
do
    read n
    x=$n
    count=$(($count + 1))
    sum=$(($sum + $x))
done
result=`echo $sum $p | awk '{printf "%.3f", $1/$2 }'`
echo $result

相关内容