Com realitzar el mode de depuració de comprovació de sintaxi als scripts de Shell


Vam començar la sèrie de depuració de scripts d'intèrpret d'ordres explicant les diferents opcions de depuració i com habilitar els modes de depuració de scripts d'intèrpret d'ordres.

Després d'escriure els vostres scripts d'intèrpret d'ordres, es recomana que comprovem pràcticament la sintaxi dels scripts abans d'executar-los, en lloc de mirar-ne la sortida per confirmar que funcionen correctament.

En aquesta part de la sèrie, veurem com utilitzar el mode de depuració de comprovació de sintaxi. Recordeu que vam explicar les diferents opcions de depuració a la primera part d'aquesta sèrie i aquí, les utilitzarem per realitzar la depuració de scripts.

Abans de passar al focus principal d'aquesta guia, explorem breument el mode detallat. S'habilita mitjançant l'opció de depuració -v, que indica a l'intèrpret d'ordres que mostri totes les línies d'un script mentre es llegeixen.

Per demostrar com funciona això, a continuació es mostra un script d'intèrpret d'ordres de mostra per convertir per lots imatges PNG a format JPG.

Escriviu-lo (o copieu-lo i enganxeu-lo) en un fitxer.

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

A continuació, deseu el fitxer i feu que l'script sigui executable mitjançant l'ordre següent:

$ chmod +x script.sh

Podem invocar l'script i mostrar-hi totes les línies tal com les llegeix l'intèrpret d'ordres de la següent manera:

$ bash -v script.sh

Tornant al nostre tema d'èmfasi, el -n activa el mode de comprovació de sintaxi. Indica a l'intèrpret d'ordres que bàsicament llegeixi totes les ordres, però no les executa, només examina la sintaxi utilitzada.

En cas que hi hagi errors al vostre script d'intèrpret d'ordres, l'intèrpret de comandaments enviarà els errors al terminal, en cas contrari, no mostrarà res.

La sintaxi per activar la comprovació de sintaxi és la següent:

$ bash -n script.sh

Com que la sintaxi de l'script és correcta, l'ordre anterior no mostrarà cap sortida. Per tant, intentem eliminar la paraula done que tanca el bucle for i veiem si mostra un error:

A continuació es mostra l'script d'intèrpret d'ordres modificat per convertir per lots imatges png a format jpg que conté un error.

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

Deseu el fitxer i, a continuació, executeu-lo mentre feu la comprovació de sintaxi:

$ bash -n script.sh

A partir de la sortida anterior, podem veure que hi ha un problema de sintaxi amb el nostre script, al bucle for li falta una paraula clau de tancament done. I l'intèrpret d'ordres el va cercar fins al final del fitxer i un cop no el va trobar (fet), l'intèrpret d'ordres va imprimir un error de sintaxi:

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

També podem combinar el mode detallat i el mode de verificació de sintaxis junts:

$ bash -vn script.sh

Alternativament, podem habilitar la comprovació de sintaxi modificant la primera línia de l'script anterior com a l'exemple següent.

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

Com abans, deseu el fitxer i executeu-lo mentre feu la comprovació de sintaxi:

$ ./script.sh

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

A més, podem utilitzar la comanda integrada set shell per habilitar el mode de depuració a l'script anterior.

A l'exemple següent, només estem comprovant la sintaxi del bucle for al nostre script.

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

Una vegada més, deseu el fitxer i invoqueu l'script:

$ ./script.sh 

En resum, sempre hauríem d'assegurar-nos que comprovem sintàcticament els nostres scripts d'intèrpret d'ordres per capturar qualsevol error abans d'executar-los.

Per enviar-nos qualsevol pregunta o comentari sobre aquesta guia, utilitzeu el formulari de resposta següent. A la tercera part d'aquesta sèrie, passarem a explicar i utilitzar el mode de depuració de rastreig de shell.