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)).
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
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다