¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?
¿Es posible comprobar la sintaxis de un script bash sin ejecutarlo?
Usando Perl, puedo ejecutar perl -c 'script name'
. ¿Existe algún comando equivalente para los scripts bash?
bash -n scriptname
Quizás una advertencia obvia: esto valida la sintaxis pero no verificará si su script bash intenta ejecutar un comando que no está en su ruta, como ech hello
en lugar de echo hello
.
El tiempo lo cambia todo. Aquí hay un sitio web que proporciona verificación de sintaxis en línea para scripts de shell.
Descubrí que es muy poderoso para detectar errores comunes.
Acerca de ShellCheck
ShellCheck es una herramienta de análisis estático y linting para scripts sh/bash. Se centra principalmente en manejar errores de sintaxis típicos de nivel principiante e intermedio y trampas en las que el shell simplemente muestra un mensaje de error críptico o un comportamiento extraño, pero también informa sobre algunos problemas más avanzados en los que los casos extremos pueden causar fallas retrasadas.
¡El código fuente de Haskell está disponible en GitHub!
También habilito la opción 'u' en cada script bash que escribo para realizar algunas comprobaciones adicionales:
set -u
Esto informará el uso de variables no inicializadas, como en el siguiente script 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Ejecutando el script:
$ check_init.sh
Informará lo siguiente:
./check_init.sh[4]: mensaje: Parámetro no establecido.
Muy útil para detectar errores tipográficos.
sh -n script-name
Ejecuta esto. Si hay algún error de sintaxis en el script, devuelve el mismo mensaje de error. Si no hay errores, entonces sale sin dar ningún mensaje. Puede comprobarlo inmediatamente utilizando echo $?
, que devolverá 0
la confirmación exitosa sin ningún error.
A mí me funcionó bien. Ejecuté el sistema operativo Linux, Bash Shell.
De hecho, verifico todos los scripts bash en el directorio actual en busca de errores de sintaxis SIN ejecutarlos usando find
la herramienta:
Ejemplo:
find . -name '*.sh' -print0 | xargs -0 -P"$(nproc)" -I{} bash -n "{}"
Si desea usarlo para un solo archivo, simplemente edite el comodín con el nombre del archivo.