Cum se efectuează verificarea sintaxei în modul de depanare în scripturile Shell


Am început seria de depanare a scriptului shell explicând diferitele opțiuni de depanare și modul de activare a modurilor de depanare a scriptului shell.

După ce vă scrieți scripturile shell, este recomandat să verificăm practic sintaxa din scripturi înainte de a le rula, spre deosebire de a ne uita la ieșirea lor pentru a confirma că funcționează corect.

În această parte a seriei, vom vedea cum să folosim modul de depanare a verificării sintaxei. Amintiți-vă că am explicat diferitele opțiuni de depanare în prima parte a acestei serii și aici, le vom folosi pentru a efectua depanarea scriptului.

Activarea modului de depanare profundă

Înainte de a trece la obiectivul principal al acestui ghid, să explorăm pe scurt modul verbal. Este activat de opțiunea de depanare -v, care îi spune shell-ului să afișeze toate liniile dintr-un script în timp ce sunt citite.

Pentru a demonstra cum funcționează acest lucru, mai jos este un exemplu de script shell pentru a converti în loturi imagini PNG în format JPG.

Tastați (sau copiați și lipiți) într-un fișier.

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

Apoi salvați fișierul și faceți scriptul executabil folosind comanda de mai jos:

$ chmod +x script.sh

Putem invoca scriptul și afișa toate liniile din el pe măsură ce sunt citite de shell astfel:

$ bash -v script.sh

Activarea modului de depanare pentru verificarea sintaxei în scripturile Shell

Revenind la subiectul nostru de accent, -n activează modul de verificare a sintaxei. Instruiește shell-ului să citească practic toate comenzile, dar nu le execută, el (shell) examinează doar sintaxa utilizată.

În cazul în care există erori în scriptul dumneavoastră shell, shell-ul va scoate erorile pe terminal, în caz contrar, nu afișează nimic.

Sintaxa pentru activarea verificării sintaxei este următoarea:

$ bash -n script.sh

Deoarece sintaxa din script este corectă, comanda de mai sus nu va afișa nicio ieșire. Prin urmare, să încercăm să eliminăm cuvântul terminat care închide bucla for și să vedem dacă arată o eroare:

Mai jos este scriptul shell modificat pentru a converti în loturi imaginile png în format jpg care conține o eroare.

#!/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

Salvați fișierul, apoi rulați-l în timp ce efectuați verificarea sintaxei în el:

$ bash -n script.sh

Din rezultatul de mai sus, putem vedea că există o problemă de sintaxă cu scriptul nostru, buclei for lipsește un cuvânt cheie de închidere done. Și shell-ul l-a căutat până la sfârșitul fișierului și odată ce nu l-a găsit (terminat), shell-ul a tipărit o eroare de sintaxă:

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

De asemenea, putem combina modul verbose și modul de verificare a sintaxei împreună:

$ bash -vn script.sh

Alternativ, putem activa verificarea sintaxei modificând prima linie a scriptului de mai sus, ca în exemplul următor.

#!/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

Ca și înainte, salvați fișierul și rulați-l în timp ce efectuați verificarea sintaxei:

$ ./script.sh

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

În plus, putem folosi comanda încorporată set shell pentru a activa modul de depanare în scriptul de mai sus.

În exemplul de mai jos, verificăm doar sintaxa buclei for din scriptul nostru.

#!/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

Încă o dată, salvați fișierul și invocați scriptul:

$ ./script.sh 

În rezumat, ar trebui să ne asigurăm întotdeauna că ne verificăm sintactic scripturile shell pentru a captura orice eroare înainte de a le executa.

Pentru a ne trimite orice întrebări sau feedback cu privire la acest ghid, utilizați formularul de răspuns de mai jos. În a treia parte a acestei serii, vom trece la explicarea și utilizarea modului de depanare a urmăririi shell-ului.