- 询问用户要对多少篇论文进行评分?
- 创建一个 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
循环。
在 shell 脚本中,循环for
仅用于显式列表,例如文件名列表。for
如果您正在编写 shell 脚本来解决这个问题,则根本没有必要在本练习中使用循环。
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
你只拥有任务的逻辑