Se ha publicado la versión 0.9 del proyecto ShellCheck, que desarrolla un sistema de análisis estático para scripts de shell, capaz de identificar errores en scripts considerando las particularidades de bash, sh, ksh y dash. El código del proyecto está escrito en Haskell y se distribuye bajo la licencia GPLv3. Se proporcionan componentes para la integración con Vim, Emacs, VSCode, Sublime, Atom y diversos entornos integrados que soportan la salida de información sobre errores compatible con GCC.

Se apoya la detección en el código tanto de errores de sintaxis que provocan la emisión de errores por parte del intérprete en tiempo de ejecución, como de problemas semánticos, debido a los cuales la ejecución no se interrumpe, pero surgen anomalías en el comportamiento del script. El analizador también puede identificar cuellos de botella, problemas no evidentes y trampas que pueden causar fallos en determinadas circunstancias.
Entre las clases de errores identificables se pueden señalar problemas con la escape de caracteres especiales y la delimitación con comillas, errores en expresiones condicionales, uso incorrecto de comandos, problemas de manejo de tiempo y fechas, y errores de sintaxis típicos de novatos. Por ejemplo, la falta de espacios al comparar "[[ $foo==0 ]]", la presencia de espacios "var = 42" o la asignación del símbolo $ sin el adecuado espaciado "foo=42", el uso de variables sin comillas "echo $1", la inclusión de corchetes adicionales en "tr -cd '[a-zA-Z0-9]'".
Además, se apoya la salida de recomendaciones para mejorar el estilo del código, resolver problemas de portabilidad y aumentar la fiabilidad de los scripts. Por ejemplo, en lugar de "echo $[1+2]" se sugerirá utilizar la sintaxis "$((..))", la construcción 'rm -rf "$STEAMROOT/"*' será marcada como insegura y capaz de eliminar el directorio raíz si la variable $STEAMROOT no está establecida, y el uso de "echo {1..10}" se resaltará como incompatible con dash y sh.
En la nueva versión:
- Se ha añadido una advertencia para expresiones como 'local readonly foo'.
- Se ha añadido una advertencia sobre la indisponibilidad de comandos.
- Se ha añadido una advertencia sobre referencias circulares en 'declare x=1 y=$x'.
- Se ha añadido una advertencia si $? se utiliza para emitir el código de retorno de echo, printf, [ ], [[ ]] y test.
- Se ha añadido una recomendación para eliminar ((..))inarray[((idx))]=val.
- Se ha añadido una recomendación para fusionar dobles corchetes en contextos aritméticos.
- Se ha añadido una recomendación para eliminar paréntesis en la expresión a[(x+1)]=val.
Fuente: opennet.ru
