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