- 사용자에게 평가할 논문 수를 묻나요?
- 각 논문의 입력 점수를 필요한 횟수만큼 반복하는 for 루프를 만듭니다.
- 사용자에게 각 점수(1~100)를 물어보세요.
- 루프 수 계산
- 프로그램이 끝나면 모든 시험지의 평균 점수가 표시됩니다.
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 스크립트에서 정수를 반복해야 하는 경우 seq
Type을 사용할 수 있습니다.
$ man seq
콘솔에서 작동 방식을 읽어보세요.
한 줄 예:
$ for i in $(seq 1 10); do echo $i; done
1
2
3
4
5
6
7
8
9
10
echo $i
작업의 논리만 갖고 있는 대신