Kako izvršiti provjeru sintakse u modu za otklanjanje grešaka u shell skriptama


Započeli smo seriju otklanjanja grešaka u shell skripti objašnjavajući različite opcije otklanjanja grešaka i kako omogućiti načine otklanjanja grešaka u shell skripti.

Nakon što napišete vaše shell skripte, preporučuje se da praktično provjerimo sintaksu u skriptama prije nego što ih pokrenemo, umjesto da gledamo njihov izlaz kako bismo potvrdili da rade ispravno.

U ovom dijelu serije ćemo proći kroz način korištenja moda za otklanjanje grešaka provjere sintakse. Zapamtite da smo objasnili različite opcije za otklanjanje grešaka u prvom dijelu ove serije i ovdje ćemo ih koristiti za otklanjanje grešaka u skripti.

Omogućavanje režima opširnog otklanjanja grešaka

Prije nego što pređemo na primarni fokus ovog vodiča, ukratko istražimo detaljni način rada. Omogućava ga opcija za otklanjanje grešaka -v, koja govori ljusci da prikaže sve redove u skripti dok se čitaju.

Da biste demonstrirali kako ovo funkcionira, ispod je primjer shell skripte za grupno pretvaranje PNG slika u JPG format.

Otkucajte (ili kopirajte i zalijepite) u datoteku.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Zatim sačuvajte datoteku i učinite skriptu izvršnom koristeći naredbu ispod:

chmod +x script.sh

Možemo pozvati skriptu i prikazati sve redove u njoj dok ih ljuska čita na sljedeći način:

bash -v script.sh

Omogućavanje moda za otklanjanje grešaka za provjeru sintakse u shell skriptama

Vraćajući se na našu temu naglaska, -n aktivira mod za provjeru sintakse. On daje instrukcije ljusci da u osnovi pročita sve naredbe, ali ih ne izvršava, ona (ljuska) samo ispituje korištenu sintaksu.

U slučaju da postoje greške u vašoj shell skripti, ljuska će ispisati greške na terminalu, u suprotnom ne prikazuje ništa.

Sintaksa za aktiviranje provjere sintakse je sljedeća:

bash -n script.sh

Budući da je sintaksa u skripti ispravna, gornja naredba neće prikazati nikakav izlaz. Stoga, hajde da pokušamo ukloniti riječ done koja zatvara for petlju i vidjeti da li pokazuje grešku:

Ispod je modificirana shell skripta za grupno pretvaranje png slika u jpg format koji sadrži grešku.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Sačuvajte datoteku, a zatim je pokrenite dok vršite provjeru sintakse u njoj:

bash -n script.sh

Iz gornjeg izlaza možemo vidjeti da postoji problem sa sintaksom sa našom skriptom, for petlji nedostaje ključna riječ za zatvaranje done. I ljuska ga je tražila do kraja datoteke i kada ga nije pronašla (gotovo), shell je ispisala sintaksičku grešku:

script.sh: line 11: syntax error: unexpected end of file

Možemo i kombinirati opširni način rada i način provjere sintakse zajedno:

bash -vn script.sh

Alternativno, možemo omogućiti provjeru sintakse tako što ćemo modificirati prvi red gornje skripte kao u sljedećem primjeru.

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Kao i ranije, sačuvajte datoteku i pokrenite je dok vršite provjeru sintakse:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

Osim toga, možemo koristiti ugrađenu naredbu set shell da omogućimo način otklanjanja grešaka u gornjoj skripti.

U primjeru ispod, samo provjeravamo sintaksu for petlje u našoj skripti.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Još jednom, sačuvajte datoteku i pozovite skriptu:

./script.sh 

Ukratko, uvijek bismo trebali osigurati da sintaktički provjeravamo naše shell skripte kako bismo uhvatili bilo kakvu grešku prije nego što ih izvršimo.

Da biste nam poslali bilo kakva pitanja ili povratne informacije u vezi sa ovim vodičem, koristite obrazac za odgovore u nastavku. U trećem dijelu ove serije preći ćemo na objašnjenje i korištenje shell tracing moda za otklanjanje grešaka.