Para script de linux de loop [fechado]

1
  1. Pergunte ao usuário quantos trabalhos avaliar?
  2. Crie um loop for que faça um loop nos tempos necessários para que a pontuação de cada papel seja inserida.
  3. Peça ao usuário por cada pontuação (1-100).
  4. conta o número de loops
  5. No final do programa, exiba a pontuação média de todos os trabalhos

Eu fiz um por um loop while mas não sei como fazer o loop

#!/bin/bash

set -x

count=0
papers=0
score=0
grade=0
average=0

read -p " How many papers would you like to grade? " papers

while [ $count -lt $papers ]
do
    read -p " Please enter a score " grade
    score='expr $score + $grade'
    count=$((count + 1))
done

average='expr $score / $papers'
echo $average
    
por bren 27.11.2018 / 14:40

3 respostas

0

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 .

    
por 27.11.2018 / 16:11
0

Você fez quase tudo que eu acabei de alterar seu loop while em loop.

#!/bin/bash
set -x
declare -i score=0
declare -i grade=0
read -p " How many papers would you like to grade? " papers
for ((count=0; count<$papers; count++)) ;do
 read -p " Please enter a score " grade
 score=$(expr $score + $grade)
 done
average=$(expr $score / $papers)
echo $average
    
por 27.11.2018 / 14:55
0

Vejo que você já aceitou uma resposta, mas fornecerei uma perspectiva um pouco diferente. Se você precisar iterar sobre inteiros em um script bash, use seq Type

$ man seq

em um console e leia como funciona.

Exemplo de oneliner:

$ for i in $(seq 1 10); do echo $i; done
1
2
3
4
5
6
7
8
9
10

em vez de echo $i , você terá sua lógica para sua tarefa

    
por 27.11.2018 / 15:32