For 루프 Linux 스크립트 [닫기]

For 루프 Linux 스크립트 [닫기]
  1. 사용자에게 평가할 논문 수를 묻나요?
  2. 각 논문의 입력 점수를 필요한 횟수만큼 반복하는 for 루프를 만듭니다.
  3. 사용자에게 각 점수(1~100)를 물어보세요.
  4. 루프 수 계산
  5. 프로그램이 끝나면 모든 시험지의 평균 점수가 표시됩니다.

while 루프를 만들었지만 for 루프를 만드는 방법을 모르겠습니다

#!/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

답변1

지침을 무시하고 내가 생각한 대로 수행합니다(어차피 포인트를 계산해야 한다면(포인트 4) 사용자에게 포인트 수(포인트 1)를 물어볼 필요가 없기 때문에 지침은 어쨌든 가짜입니다).

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) }'

시험:

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

이렇게 하면 스크립트로의 리디렉션을 사용하여 파일에서 점수를 쉽게 읽을 수 있습니다 awk.

마찬가지입니다 /bin/sh(그러나 정수가 아닌 입력/결과를 처리하지 않음).

#!/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 ))"

분수의 개수를 고집한다면 범위를 벗어난 분수를 다르게 처리해야 합니다.

#!/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 ))"

이런, 또 다른 while사이클이군요.

쉘 스크립트에서 루프는 for파일 이름 목록과 같은 명시적인 목록에만 사용됩니다. for이 문제를 해결하기 위해 쉘 스크립트를 작성했다면 이 연습에서는 루프를 사용할 필요가 전혀 없습니다.

for이 연습의 합리적인 사용 사례는 루프를 사용하여 해결할 수 있습니다.

#!/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 ))"

스크립트는 명령줄에서 점수를 허용합니다.

$ sh ./script.sh 1 20 10 22 3001 20
Invalid score (3001), must be [1,100]
Average: 14

점수 목록은 정적 목록이므로 루프를 사용하여 반복하는 것이 적합합니다 for.

답변2

방금 while 루프를 for 루프로 변경한 모든 작업이 거의 완료되었습니다.

#!/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

답변3

귀하는 이미 답변을 수락하셨지만 저는 약간 다른 관점을 제시하겠습니다. Bash 스크립트에서 정수를 반복해야 하는 경우 seqType을 사용할 수 있습니다.

$ man seq

콘솔에서 작동 방식을 읽어보세요.

한 줄 예:

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

echo $i작업의 논리만 갖고 있는 대신

관련 정보