为什么会出现此错误“第 26 行:意外标记‘完成’附近的语法错误?”

为什么会出现此错误“第 26 行:意外标记‘完成’附近的语法错误?”
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

依此类推,直到您有一个脚本,其中每一行都执行您希望它执行的操作,并且直到您知道它正在正确执行(并且您知道它确实正确,因为您在几乎每添加一行之后都测试了脚本)。

相关内容