0

正是它所说的。我正在尝试根据书中的问题编写一个简单的 bash 脚本。我正在尝试使用 case 语句,并且据我所知,我正在正确使用它。但是,我不断收到“意外令牌'$'in\r' case $i in 附近的语法错误。

不知道为什么。我也确定我的代码中还有其他问题,因为这是我的第一个脚本。case 语句在第 10 行。随意更正任何其他内容,最终程序将为学生成绩构建一个成绩数据文件,使用简单的 awk 脚本计算成绩的平均值,并将所有内容放入输出文件中。

function getStudentData () { 
    i=0
    while [ $i<5 ]
    do
        case $i in
           [0]) echo -n "Enter student name\n"
              read name
              ;;
           [1]) echo -n "Enter Quiz grade\n" 
                read quiz
                checkLimits $quiz
                ;;
           [2]) echo -n "Enter homework grade\n"
                read hw
                checkLimits $hw
                ;;
            [3]) echo -n "Enter midterm grade\n"
                 read midterm
                 checkLimits $midterm
                  ;;
           [4]) echo -n "Enter Final grade \n"
                read final
                checkLimits $final
                ;;
        esac
done
}

function checkLimits ($grade) {
if [ grade <= 100 || grade >= 0 ]; then
    $i--
fi
}

if [ $# -lt 2 ]; then
echo "Incorrect number of arguments"
exit 1
fi

#Check awk existance
if [ ! -e $2 ]; then
echo "Error, .awk file does not exist"
exit 1
fi

#flag for data file existing, and awk file
flag=0

#Check for data file existing
if [ ! -e $1 ];then
flag=0
else
flag=1
fi
ans="yes"
while [ $ans == "yes" || $ans == "y" ]
do
echo "Do you want to enter a student record?"
read ans

if [ $ans == "y" || $ans == "yes" ];then
    getStudentData 

else
    echo "we done"
    exit 1
fi
done
4

1 回答 1

1

如果你把它写成一个循环,那么你可能应该写:

function getStudentData () { 
    i=0
    while [[ $i < 5 ]]
    do
        case $i in
           0) echo -n "Enter student name: "
              read name
              ;;
           1) echo -n "Enter Quiz grade: " 
              read quiz
              checkLimits $quiz
              ;;
           2) echo -n "Enter homework grade: "
              read hw
              checkLimits $hw
              ;;
           3) echo -n "Enter midterm grade: "
              read midterm
              checkLimits $midterm
              ;;
           4) echo -n "Enter Final grade: "
              read final
              checkLimits $final
              ;;
        esac
    done
}

function checkLimits() {
    if [[ $1 -gt 100 || $1 -lt 0 ]]
    then ((i--))
    fi
}

这解决了许多问题:

  1. while 循环中的测试条件。
  2. 不明显的使用echo -n来抑制换行加上\n添加换行。
  3. 缩进。
  4. 函数的语法checkLimits()
  5. checkLimits()函数中条件的语法。
  6. checkLimits()取消反转函数中条件的反转逻辑。
  7. 实际上递减变量i

它没有修复对全局变量的依赖$i,这很丑陋。

循环的目的必须是在出现错误时返回并重新输入数据。这是一个聪明的主意。不幸的是,你永远不会递增$i,所以它并没有真正起作用。

这是一些工作代码:

function getStudentData () { 
    for ((i = 0; i < 5; i++))
    do
        case $i in
           0) echo -n "Enter student name: "
              read name
              ;;
           1) echo -n "Enter Quiz grade: " 
              read quiz
              checkLimits $quiz
              ;;
           2) echo -n "Enter homework grade: "
              read hw
              checkLimits $hw
              ;;
           3) echo -n "Enter midterm grade: "
              read midterm
              checkLimits $midterm
              ;;
           4) echo -n "Enter Final grade: "
              read final
              checkLimits $final
              ;;
        esac
    done
}

function checkLimits() {
    if [[ $1 -gt 100 || $1 -lt 0 ]]
    then ((i--))
    fi
}

getStudentData
echo "Name     = $name"
echo "Quiz     = $quiz"
echo "Homework = $hw"
echo "Midterm  = $midterm"
echo "Final    = $final"

示例运行的输出:

Enter student name: Eileen
Enter Quiz grade: 92
Enter homework grade: 94
Enter midterm grade: 95
Enter Final grade: 97
Name     = Eileen
Quiz     = 92
Homework = 94
Midterm  = 95
Final    = 97
于 2013-10-29T03:34:05.820 回答