Поправи грешку у синтакси Басх у близини неочекиваног токена

Programiranje u Linux Bash terminalu postalo je dominantna praksa u svetu razvoja softvera. Softverski inženjeri i studenti koji se upuštaju u učenje programskih jezika često nailaze na različite greške. Ako ste se više puta susreli sa greškama kao što su „Sintaksna greška blizu neočekivanog tokena `(`“ ili „Bash sintaksna greška blizu neočekivanog tokena“, ovaj članak nudi rešenja koja će vam pomoći da savladate ove prepreke i postanete vešt programer. Sledite opisane metode korak po korak kako biste uspešno otklonili greške u komandnim linijama vaših datoteka.

Rešavanje sintaksne greške u Bash-u blizu neočekivanog tokena

Linux Bash je interaktivni tumač komandne linije za sisteme zasnovane na Linux-u i predstavlja modernu zamenu za Bourne Shell (sh). Datoteke se u Linux Bash skriptama označavaju ekstenzijom .sh. Problemi u formatiranju koda u shell skriptama mogu uzrokovati sintaksne greške. Kada se greška nalazi blizu znaka `(`, terminal će vas uputiti na problematičan red i prijaviti odgovarajuću grešku. Budući da Linux Bash funkcioniše kao tumač, red sa greškom će biti prikazan u terminalu, a izvršavanje skripte će biti prekinuto. Stoga je neophodno popraviti grešku u datoj komandnoj liniji pre nego što nastavite sa daljim ispravljanjem neočekivanih tokena u skripti. U nastavku su navedeni najčešći uzroci sintaksnih grešaka blizu neočekivanog tokena u Linux Bash-u:

  • Problemi sa izlaznim sekvencama – Neispravno korišćenje izlaznih sekvenci ili navodnika unutar Bash skripti može dovesti do grešaka. Potrebno je osigurati da su izlazne sekvence i navodnici pravilno formatirani.

  • Netačna sintaksa u kodu – Nepravilno napisan kod, kao što je pogrešan redosled petlji, može prouzrokovati sintaksne greške.

  • Neispravna upotreba komandi – Ukoliko se komande ne koriste pravilno, na primer, ako se vrednosti ne dodeljuju ispravno, može doći do sintaksne greške.

  • Nekompatibilnost operativnih sistema – Neusklađenost shell skripti između Unix i DOS sistema može prouzrokovati neočekivane greške.

  • Problemi sa Bash skriptama – Problemi u Bash skriptama koje su kopirane sa drugih sistema takođe mogu dovesti do neočekivanih grešaka tokena.

Za potrebe ilustracije, razmotrite datoteku pod nazivom `example.sh`, kreiranu u Linux Bash skripti, koja sadrži različite komandne linije sa potencijalnim sintaksnim greškama. Ova datoteka obuhvata sve moguće komande koje se mogu koristiti u shell skriptama.

str= ‘Prva komandna linija ‘(primer datoteke)’ u skripti’
str= [(1,2),(3,4)]
if[ $day == “pon” ] then
 echo “pon”
else
 echo “nije pon”
fi
for PROMENLJIVA in {0..2}; then
do echo komanda1; echo komanda2; echo komanda3; echo komanda4; done
while true; do if [ $ dan == “pon” ]; then echo “pon”; else echo “nije pon”; done; fi

Metod 1: Ručno ispravljanje grešaka u svakoj komandnoj liniji

Prvi pristup za rešavanje problema je ručna korekcija sintaksnih grešaka u svakom redu koda u skripti. U ovom odeljku su detaljno objašnjeni koraci za uklanjanje sintaksnih grešaka blizu neočekivanog tokena u komandnim linijama. Postupak rešavanja neočekivane greške tokena u terminalu je opisan u nastavku. Pokrenite datoteku u terminalu upisivanjem komande `./example.sh` i pritiskom na Enter.

2. Obratite pažnju na redove koji sadrže neočekivanu grešku tokena u rezultatima prikazanim ispod.

3. Ispravite grešku u svakom redu prateći metode opisane u nastavku i sačuvajte datoteku.

4. Ponovo pokrenite datoteku nakon izmena i proverite da li je sintaksna greška otklonjena.

Korak I: Pregled sadržaja datoteke

Prvi korak u otklanjanju sintaksne greške u komandnim linijama je pregled sadržaja datoteke u terminalu. Ukoliko postoje problemi sa datotekom, možda nećete biti u mogućnosti da je pravilno pregledate. Uobičajena praksa je pokretanje datoteke pomoću komande `./example.sh`, ali to vam ne omogućava izmenu njenog sadržaja. U nastavku su opisane opcije za pregled sadržaja datoteke i izmenu komandnih linija kako biste rešili sintaksnu grešku blizu neočekivanog tokena `(`.

Opcija 1: Upotreba `CAT` komande

Prva opcija je korišćenje komande `cat` za pregled datoteke u shell skripti. Sadržaj datoteke sa neočekivanom greškom tokena možete pročitati tako što ćete u terminal upisati komandu `cat -v example.sh`.

Napomena 1: `example.sh` se koristi samo kao primer, te je potrebno da unesete ime datoteke koja sadrži neočekivanu grešku tokena.

Napomena 2: Komanda `cat -v` se koristi za prikazivanje svih nevidljivih karaktera, koji mogu biti razmaci za povratak ili razmaci bez prekida.

Opcija 2: Upotreba `VX` komande

Ukoliko ne možete koristiti komandu `cat`, možete pokušati da upotrebite komandu `vx` za pregled i izmenu komandi u datoteci. U terminal upišite komandu `sh -vx ./example.sh` da biste otvorili datoteku.

Opcija 3: Upotreba `od -a` komande

Ako u komandnim linijama postoji više nevidljivih znakova, možete koristiti komandu `od -a` za pregled datoteke. Ukoliko sadržaj datoteke nije vidljiv u kodu, pokušajte da je pregledate pomoću komande `od -a example.sh` kako biste mogli da izmenite kod.

Korak II: Uklanjanje preloma linija Windows formata

Ako u shell skripti postoje prelomi linija Windows formata, možete koristiti konzolne komande da ih uklonite i prekopirate kod u novu datoteku kako biste ispravili grešku.

U terminal upišite sledeću komandu da biste sačuvali sadržaj datoteke u drugu datoteku pod nazivom `correctedexample.sh`, čime ćete ukloniti prelome linija Windows formata u skripti.

tr -d 'r' <example.sh> correctedexample.sh

Korak III: Podešavanje dozvola za novokreiranu datoteku

Potrebno je podesiti dozvole za novokreiranu datoteku kako biste mogli da je uređujete i kako bi se datoteka mogla izvršiti u shell-u. U terminal upišite komandu `chmod 755 correctedexample.sh` kako biste dali dozvole datoteci i omogućili njeno pokretanje. Sada možete pregledati ispravljenu datoteku, rešiti probleme sa formatiranjem i otkloniti sintaksnu grešku blizu neočekivanog tokena `(` u datoteci.

Korak IV: Formatiranje koda u datoteci

Sledeći korak je pojedinačno formatiranje linija koda i ručna izmena komandnih linija u datoteci. U nastavku su opisane opcije za formatiranje datoteke kako bi se rešila sintaksna greška blizu neočekivanog tokena `(`.

Opcija 1: Zamena jednostrukih navodnika dvostrukim

Ako u komandnim linijama koristite jednostruke navodnike, potrebno je da izmenite komandu tako što ćete ih zameniti dvostrukim navodnicima kako biste otklonili sintaksnu grešku. U datoteci `example.sh` uklonite redove koda koji sadrže `’` ili jednostruke navodnike u komandi i zamenite ih dvostrukim navodnicima ili znakovima `“` i `“`. U datoteci primera, morate da promenite kod u: `str= “Prva komandna linija “(primer datoteke)” u skripti”`

Napomena: Dvostruki navodnici su neophodni za parametre poput `str= “[(1,2),(3,4)]”`.

Opcija 2: Dodavanje znaka `$` u stringove

Ako ste u skripti dodali vrednosti stringova, potrebno je da im dodate znak `$` kako biste otklonili sintaksnu grešku. Dodajte `$` komandnim linijama sa vrednostima stringova da biste rešili neočekivanu grešku. U datoteci primera, promenite komandnu liniju u:

str= $ ‘Prva komandna linija ‘(primer datoteke)’ u skripti’

Napomena: Korišćenjem znaka `$` u stringu možete izbeći izlaznu sekvencu kose crte jer se komandne linije dekodiraju ANSI C standardom. Drugim rečima, korišćenjem `$` za vrednost stringa možete izbeći upotrebu dvostrukih navodnika umesto jednostrukih u komandnim linijama.

Opcija 3: Konvertovanje tabova u razmake

Razmaci između dve izjave u komandi moraju biti razmaci umesto tabova kako bi se otklonila sintaksna greška u skripti. Ako dobijete grešku u Cygwin-u, pokušajte da konvertujete tabove u razmake da biste ispravili grešku. Komandna linija je data ispod:

do echo komanda1;    echo komanda2;        echo komanda3;        echo komanda4;        done

Gornju komandu treba prepisati kako je prikazano ispod kako biste ispravili grešku.

do echo komanda1; echo komanda2; echo komanda3; echo komanda4; done

Opcija 4: Korišćenje Escape karaktera

Kada koristite Bash karaktere, važno je da koristite escape karakter zajedno sa Bash karakterom kako biste otklonili sintaksnu grešku. Zagrade `()` su Bash specijalni karakteri u datoteci, stoga je potrebno koristiti escape karakter ili obrnutu kosu crtu u komandnoj liniji kako biste izbegli normalne karaktere pri izvršavanju komande. Komanda `str= ‘Prva komandna linija od ‘(primer datoteke)’ u skripti’` ne bi trebalo da proizvodi grešku u terminalu jer se koristi escape karakter.

Opcija 5: Korišćenje razmaka između znakova

Shell skripta prepoznaje komande i izjave prema podrazumevanim vrednostima. Morate osigurati pravilnu upotrebu razmaka između znakova kako bi shell mogao da identifikuje komandu datu u skripti. Razmak je znak koji se koristi za razlikovanje dva znaka u komandnoj liniji. U kodu nema razmaka između `if` i `[`, što rezultira neočekivanom greškom tokena jer shell ne prepoznaje `if[` komandu. Ako se kod promeni u `if [ $ dan == “pon” ];`, greška se može rešiti jer shell prepoznaje komandu `if`.

Opcija 6: Korišćenje separatora komandi za izjave

Različite komande u shell skripti moraju biti razdvojene kako bi terminal mogao da identifikuje pojedinačne komande. Potrebno je koristiti separator komandi za otklanjanje sintaksne greške u Linux Bash-u. Izjave u komandi moraju biti razdvojene separatorom komandi, kao što su tačka i zarez `;` ili novi red pritiskom na Enter. Na primer, komanda u kodu `if [ $ dan == “pon” ] then` mora se promeniti u `if [ $ dan == “pon” ]; then` da bi se ispravila greška. Pošto se tačka i zarez koristi kao separator između znakova `[` i `then`, možete ispraviti ovu grešku.

Opcija 7: Uklanjanje dodatnih izjava

Ponekad se može dogoditi da su dodate dodatne izjave ili da su pomešani kodovi u slučaju višestrukih ugnježdenih petlji. Potrebno je ukloniti dodatne izjave u komandnim linijama kako bi se rešila sintaksna greška blizu neočekivanog tokena `(` u Linux Bash-u. Bash petlje `for…done` i konstrukcije `if…fi` moraju biti u ispravnoj sintaksi. Datoteka primera ima pogrešnu sintaksu u `for` petlji jer sadrži termin `then` koji se koristi u `if` izjavi. Izmenom koda kao što je prikazano u nastavku ispraviće se greška neočekivanog tokena. Izjava `then` je dodatna izjava u kodu i uklanjanje ovog termina će ispraviti grešku.

for PROMENLJIVA in {0..2}; do echo komanda1; echo komanda2; echo komanda3; echo komanda4; done 

Opcija 8: Osiguravanje pravilnog redosleda zatvaranja izjava

Ako koristite mnogo ugnježdenih ili uslovnih izjava u shell skripti, morate osigurati da su petlje zatvorene redosledom kojim su otvorene. Možete koristiti separator za novi red da biste izbegli konflikte sa petljama. Redosled zatvaranja ugnježdenih petlji i uslovnih izjava mora biti tačan i ne sme se menjati. Petlje u kodu `while true; do if [ $ dan == “pon” ]; then echo “pon”; else echo “nije pon”; done; fi` moraju se zatvoriti u ispravnom redosledu. Promena koda kako je prikazano u nastavku može da ispravi neočekivanu grešku tokena, jer se na ovaj način ispravlja redosled zatvaranja izjava.

while true; do if [ $ dan == “pon” ]; then echo “pon”; else echo “nije pon”; fi; done

Metod 2: Prepisivanje koda

Ukoliko ste kopirali kod i nalepili ga u novu datoteku u terminalu, možete pokušati da ručno prepišete kod kako biste ispravili grešku. Greške u kodu se mogu otkloniti ako ste kod napisali bez ikakvih grešaka u formatu shell skripte. To je zato što skriveni znakovi i problemi sa formatiranjem u uređivaču teksta, kao što je Microsoft Word, koje ste možda koristili za kopiranje koda, mogu dovesti do greške.

Metod 3: Upotreba komande `dos2unix.exe`

Ako koristite Unix operativni sistem, možete pisati kodove sa znakom za prelazak u novi red `n` za prelazak u sledeći red u datoteci. Međutim, ako koristite Windows OS, potrebno je da pređete u sledeći red u kodu pomoću povratka kočije i prelaska u novi red ili `rn` u datoteci. Ako izvršite kod napisan u Windows operativnom sistemu u Cygwin-u, možete dobiti sintaksnu grešku blizu neočekivanog tokena `(`.

Da biste ispravili grešku, potrebno je da obrišete znakove za povratak kočije koristeći alatku komandne linije DOS u Unix-u kao konverter formata tekstualne datoteke. U terminal upišite sledeću komandu `dos2unix.exe example.sh` i možete konvertovati datoteku u Unix format.

***

U članku su obrađene osnovne metode za ispravljanje Bash sintaksne greške blizu neočekivanog tokena `(` u skripti. Ako koristite Linux Bash, možete koristiti metode objašnjene u ovom odeljku za rešavanje ove greške. Ukoliko vam je ovaj sadržaj bio koristan, ostavite svoje predloge i pitanja u odeljku za komentare.