Чтобы вычислить среднее значение, взяв аргумент командной строки

Задача состоит в том, что если входные номера:

4 1 2 9 8 

Выход = (сумма всех, кроме first_number_in_series) / first_number последовательно. Затем среднее значение вывода должно быть 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 

Вы не смогли сказать, что номера присваиваются сценарию в stdin.

Для этого этот код будет работать:

 #!/bin/bash readarray -tx 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 

Так как вам нужен расчет с плавающей запятой, в конечном итоге вы будете использовать 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 

Вы включили первое число в сумму, и вы написали плохое состояние:

if [ count -eq "1" ]

вместо

if [ $count -eq 1 ]

$ operator позволяет вам получить доступ к переменной, и вы использовали 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