for (( i=1; i<= $numberstudent; i++ ))
do
head -n $i fullstudentsMarks | tail -n 1 > $(cut -f 2 -d ' ')
npassed=0
sum=0
average=0
for (( j=3; j<= 10; j++ ))
do
mark=$(cut -f $j -d ' ' $(cut -f 2 -d ' ' fullstudentsMarks))
if ($mark>=60)
then
$npassed=$npassed+1
fi
$sum=$sum+mark
done
$average=$sum / $npassed
if ($npassed==8);then
result="successful"
else if ($npassed>=5);then
result="trans"
else
result="lost"
fi
idstudent=$(head -n $i fullstudentsMarks | tail -n 1 | cut -f 1 -d ' ')
echo $idstudent+" "+$reslut+" "+$average >> resandavg
done
答案1
请将您的脚本粘贴到外壳检查。它会给你很多错误消息,指出代码中不完全正确的部分。
但你永远不应该到那里。在编写该行之前,您应该已经对该脚本进行了十几次测试$average=$sum / $npassed
。
一般来说,当您进行任何类型的编程时:不要等到最后才进行测试,期望程序在编写完所有程序后能够完美运行。最好在编写代码时逐步测试代码。使用 shell 脚本尤其容易,因为不涉及编译步骤。
没有人编写一个完整的 shell 脚本,其中包含中等复杂的逻辑,并在第一次尝试时正确解析(如果他们这样做了,他们可能只是幸运和惊讶)。
例如,您可以从
for (( i = 1; i <= numberstudent; i++ )); do
echo "$i"
done
有效吗?为什么不?嗯,numberstudent
没有价值。我们假设现在是 23 点。
然后加一新行并再次测试:
numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1 > $(cut -f 2 -d ' ')
done
那里发生了什么?为什么我收到“没有这样的文件或目录”或“不明确的重定向”?我到底想要这条线做什么?好吧,脚本里一下子加了太多东西,删减一下吧:
numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1
done
$i
在那里,现在它选择与out of相对应的行fullstudentsMarks
并显示它。 (不知道这是否是你的实际上故意的)
但是哦,numberstudent
需要是文件中的行数!好的。
numberstudent="$( wc -l <fullstudentsMarks )"
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1
done
依此类推,直到您有一个脚本,其中每一行都执行您希望它执行的操作,并且直到您知道它正在正确执行(并且您知道它确实正确,因为您在几乎每添加一行之后都测试了脚本)。