Cómo realizar el modo de depuración de verificación de sintaxis en scripts de Shell


Comenzamos la serie de depuración de scripts de shell explicando las diferentes opciones de depuración y cómo habilitar los modos de depuración de scripts de shell.

Después de escribir sus scripts de shell, se recomienda que verifiquemos prácticamente la sintaxis en los scripts antes de ejecutarlos, en lugar de mirar su salida para confirmar que están funcionando correctamente.

En esta parte de la serie, veremos cómo usar el modo de depuración de verificación de sintaxis. Recuerde que explicamos las diferentes opciones de depuración en la primera parte de esta serie y aquí las usaremos para realizar la depuración de scripts.

Antes de pasar al enfoque principal de esta guía, exploremos brevemente el modo detallado. Está habilitado por la opción de depuración -v , que le dice al shell que muestre todas las líneas en un script mientras se leen.

Para demostrar cómo funciona esto, a continuación se muestra un script de shell de muestra para convertir por lotes imágenes PNG a formato JPG.

Escríbalo (o cópielo y péguelo) en un archivo.

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

Luego guarde el archivo y haga que el script sea ejecutable usando el siguiente comando:

$ chmod +x script.sh

Podemos invocar el script y mostrar todas las líneas en él a medida que el shell las lee así:

$ bash -v script.sh

Volviendo a nuestro tema de énfasis, -n activa el modo de verificación de sintaxis. Le indica al shell que básicamente lea todos los comandos, sin embargo, no los ejecuta, solo examina la sintaxis utilizada.

En caso de que haya errores en su script de shell, el shell mostrará los errores en la terminal; de lo contrario, no mostrará nada.

La sintaxis para activar la verificación de sintaxis es la siguiente:

$ bash -n script.sh

Debido a que la sintaxis del script es correcta, el comando anterior no mostrará ningún resultado. Por lo tanto, intentemos eliminar la palabra done que cierra el bucle for y veamos si muestra un error:

A continuación se muestra el script de shell modificado para convertir por lotes imágenes png al formato jpg que contiene 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

Guarde el archivo, luego ejecútelo mientras realiza la verificación de sintaxis en él:

$ bash -n script.sh

De la salida anterior, podemos ver que hay un problema de sintaxis con nuestro script, al bucle for le falta una palabra clave de cierre done . Y el shell lo buscó hasta el final del archivo y una vez que no lo encontró (hecho), el shell imprimió un error de sintaxis:

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

También podemos combinar el modo detallado y el modo de verificación de sintaxis juntos:

$ bash -vn script.sh

Alternativamente, podemos habilitar la verificación de sintaxis modificando la primera línea del script anterior como en el siguiente ejemplo.

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

Como antes, guarde el archivo y ejecútelo mientras realiza la verificación de sintaxis:

$ ./script.sh

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

Además, podemos emplear el comando integrado set shell para habilitar el modo de depuración en el script anterior.

En el siguiente ejemplo, solo estamos verificando la sintaxis del bucle for en nuestro 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 vez más, guarde el archivo e invoque el script:

$ ./script.sh 

En resumen, siempre debemos asegurarnos de verificar sintácticamente nuestros scripts de shell para capturar cualquier error antes de ejecutarlos.

Para enviarnos cualquier pregunta o comentario sobre esta guía, utilice el formulario de respuesta a continuación. En la tercera parte de esta serie, pasaremos a explicar y usar el modo de depuración de rastreo de shell.