「行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

通常、ある種のプログラミングを行うときは、すべてを書いた後にプログラムが完全に機能することを期待しながら、テストが完了するのを待たないでください。コードを書いている間、段階的にテストするのが最善です。シェルスクリプトの使用はコンパイルステップがないため、特に簡単です。

誰も適度に複雑なロジックを含み、最初の試みで正しく解析する完全なシェルスクリプトを作成します(そうであれば幸運で驚くかもしれません)。

たとえば、次から始めることができます。

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

そして、すべての行が目的のタスクを実行するスクリプトがあるまで、そしてそれが正しく実行されていることが分かるまで(そして追加するほぼすべての行の後にスクリプトをテストするので、そうすることが分かるまで)続けられます。

関連情報