Desconsiderando as instruções e fazendo isso depois da minha própria cabeça (as instruções são falsas de qualquer forma, não há necessidade de perguntar ao usuário o número de pontuações (ponto 1) se elas devem ser contadas de qualquer maneira (ponto 4)). / p>
awk 'BEGIN { printf("Enter scores, one per line, end with Ctrl+D\n") }
$1 < 1 || $1 > 100 { printf("Invalid score, must be [1,100]\n"); next }
{ sum += $1; n++ }
END { printf("Average: %.2f\n", sum/n) }'
Teste:
Enter scores, one per line, end with Ctrl+D
0
Invalid score, must be [1,100]
2
3
4
5
99
100
1001
Invalid score, must be [1,100]
Average: 35.50
Isso facilitaria a leitura das pontuações de um arquivo usando apenas um redirecionamento para o script awk
.
A mesma coisa em /bin/sh
(mas não lida com entrada / resultado não inteiro):
#!/bin/sh
echo 'Enter scores, one per line, end with Ctrl+D'
while read score; do
if [ "$score" -lt 1 ] || [ "$score" -gt 100 ]; then
echo 'Invalid score, must be [1,100]'
else
sum=$(( sum + score ))
n=$(( n + 1 ))
fi
done
printf 'Average: %d\n' "$(( sum / n ))"
Se você insistir em pedir o número de pontuações, terá que lidar com pontuações fora do intervalo de maneira diferente:
#!/bin/sh
printf 'Enter the number of scores that you will enter: ' >&2
read nscores
while [ "$nscores" -gt 0 ]; do
while true; do
read score
if [ "$score" -lt 1 ] || [ "$score" -gt 100 ]; then
echo 'Invalid score, must be [1,100]'
else
break
fi
done
sum=$(( sum + score ))
n=$(( n + 1 ))
nscores=$(( nscores - 1 ))
done
printf 'Average: %d\n' "$(( sum / n ))"
Opa, outro ciclo while
.
Um loop for
, em script de shell, é usado apenas em uma lista explícita, como uma lista de nomes de arquivos. Usando um loop for
neste exercício, se você estiver escrevendo um shell script para resolvê-lo, não é necessário.
Um caso de uso razoável em que um loop for
poderia ser usado para resolver este exercício:
#!/bin/sh
for score do
if [ "$score" -lt 1 ] || [ "$score" -gt 100 ]; then
printf 'Invalid score (%d), must be [1,100]\n' "$score" >&2
else
sum=$(( sum + score ))
n=$(( n + 1 ))
fi
done
printf 'Average: %d\n' "$(( sum / n ))"
Este script aceitaria as pontuações na linha de comando:
$ sh ./script.sh 1 20 10 22 3001 20
Invalid score (3001), must be [1,100]
Average: 14
Como a lista de pontuações é uma lista estática, é apropriado fazer um loop sobre ela usando um loop for
.