Bash 使用带小数的数字的平均运算

Bash 使用带小数的数字的平均运算,bash,decimal,average,Bash,Decimal,Average,我想得到带小数的数字的平均值。我写了这个,但当我写小数时,它会给我以下错误信息: /average.sh:第10行:1.2:语法错误:算术运算符无效(错误标记为“.2”) 我的平均操作是: i=1; sum=0; while [[ i -lt 4 ]] do read nr echo "scale=2; $nr" | bc -l sum=$((sum+nr)) i=$((i+1))

我想得到带小数的数字的平均值。我写了这个,但当我写小数时,它会给我以下错误信息:

/average.sh:第10行:1.2:语法错误:算术运算符无效(错误标记为“.2”)

我的平均操作是:

i=1;
sum=0;

while [[ i -lt 4 ]]
    do
            read nr
            echo "scale=2; $nr" | bc -l
            sum=$((sum+nr))
            i=$((i+1))
    done
echo "scale=2; $sum / 4" | bc -l

如何修改它以接受带小数的输入?谢谢。

您可以按如下操作使用
bc

sum=$( echo $sum + $nr | bc -l )

您的代码在我的系统(bash 4.4.20)上运行良好,但如果您想读取4个数字,则应该将脚本的第1行修改为
i=0
。如果您也在脚本中提供输入,这会有所帮助

但是,更简单的方法是通过以下方式使用
datamash

datamash mean 1 # Calculate the mean of the first field
编辑

如果您不能使用
datamash
awk
对您有好处:

awk '{sum += $0} END {print sum / NR}'

正如
dibery
所说,如果要计算4个数字的平均值,则需要修改为
i=0

用于读取带小数的输入

read -p 'Enter: ' var
nr="$( printf '%.2f' "$var" )"
不是很优雅,但可以工作

对于求和,我认为不能像bash中的整数那样直接求和,所以不妨试试这个

sum="$( echo "$sum+$nr" | bc)"
对于打印输出,这是我更喜欢使用的格式

bc -l <<< "$sum/4"
bc-l我的服务器不接受“datamash”或“bc”实用程序,我想从键盘而不是文件中用小数求和

我试过一些例子,但不起作用:

i=1; sum=0; while [[ i -le 3 ]]; do read nr; awk '{sum+=$nr} END { print "media:"; sum/i}'; i=$((i+1));done

i=1;总和=0;当[[i-lt 4]]do read nr sum=$(echo$sum+$nr | bc-l)i=$((i+1))done echo“scale=2;$sum/4”| bc-l时,结果是错误的:输入:1.1,2.2,3,3;输出:1.65对于正常数字(1,2,3,4,5,…)它工作正常,但对于小数位数(1.2,2.3,…)它不工作。我不能在我的服务器上使用datamash,我需要找到其他方法。thanksIt看起来bash不喜欢小数,因为
$((11/3))
返回
3
@DragosDragomir我使用
awk
添加了解决方案。它应该会起作用。