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循环。

在 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 脚本中迭代整数,可以使用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你只拥有任务的逻辑

相关内容