Lütfen betiğinizi ShellCheck'e yapıştırın . Size tam olarak doğru olmayan kod bitlerine işaret eden birçok hata mesajı verecektir.
Ama orada asla bitmemeliydin. Çizgiyi yazmadan önce senaryoyu bir düzine kez denemeliydin $average=$sum / $npassed.
Genel olarak, herhangi bir programlama yaptığınızda: Testi bir programın hepsini yazdığınızda kusursuz çalışacağını beklemeden sona erdirmeyin. Kodunuzu yazarken adım adım test etmeniz daha iyi olur. Herhangi bir derleme basamağı olmadığından kabuk komutları ile yapmak özellikle kolaydır.
Hiç kimse orta derecede karmaşık bir mantıkla ve ilk denemede doğru ayrıştırmayı bile içeren tam bir kabuk betiği yazmıyor (ve yaparlarsa muhtemelen sadece şanslı ve şaşırıyorlar).
Örneğin, ile başlayabilirsiniz
for (( i = 1; i <= numberstudent; i++ )); do
echo "$i"
done
Çalışıyor mu? Neden olmasın? Öyleyse numberstudentbir değeri yok. 23 yaşındaymış gibi yapacağız.
Sonra eklemek biri tekrar yeni bir satır ve testi:
numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1 > $(cut -f 2 -d ' ')
done
Orada ne oldu? Neden "böyle bir dosya veya dizin yok" veya "belirsiz yönlendirme" alıyorum? Bu çizginin ne yapmasını bile istedim? Pekala, betiğe bir kerede çok fazla eklenmiş, biraz geri kesilmiş:
numberstudent=23
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1
done
Orada, şimdi tekabül hattını alır $idışı fullstudentsMarksve görüntüler o. ( Aslında , sizin amacınız bu mu, bilmiyorum )
Ama oh, numberstudentdosyadaki satır sayısı olmalı! Tamam.
numberstudent="$( wc -l <fullstudentsMarks )"
for (( i = 1; i <= numberstudent; i++ )); do
head -n "$i" fullstudentsMarks | tail -n 1
done
Ve böylece, her satırın yapmasını istediğiniz şeyi yaptığı bir senaryoya sahip olana kadar ve doğru bir şekilde yaptığını bilene kadar (ve bunu biliyorsunuz çünkü komut dosyasını neredeyse her eklenen satırdan sonra test ettiniz).
else ifBASH'da olan konuya odakladımelif. Başlamak için sadece bir ipucu :)