Neden bu Hata "satır 26: Beklenmeyen belirteç 'sözdizimi yakınındaki' Sözdizimi Hatası '?


1
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

Dikkatimi else ifBASH'da olan konuya odakladım elif. Başlamak için sadece bir ipucu :)
Echoes_86

5
Bu olması gerekiyordu bashmu? eğer öyleyse, birçok hata var - www.shellcheck.net 'i yararlı bulabilirsiniz
steeldriver

2
@steeldriver baPHPsh gibi görünüyor :-(
roaima

evet bu Bash
hakim alhaj

Ödevlerin sol tarafında $ kullanmayın.
Ortomala Lokni

Yanıtlar:


1

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).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.