È stata pubblicata la versione 0.9 del progetto ShellCheck, che sviluppa un sistema di analisi statica per shell script, supportando l'identificazione di errori negli script tenendo conto delle peculiarità di bash, sh, ksh e dash. Il codice del progetto è scritto in Haskell e distribuito sotto licenza GPLv3. Sono forniti componenti per l'integrazione con Vim, Emacs, VSCode, Sublime, Atom e vari ambienti integrati che supportano un output degli errori compatibile con GCC.

Supporta l'individuazione nel codice sia di errori sintattici, che portano a un errore di runtime da parte dell'interprete, sia di problemi semantici, per i quali l'esecuzione non viene interrotta ma si verificano anomalie nel comportamento dello script. L'analizzatore può anche identificare colli di bottiglia, problemi poco evidenti e insidie che possono portare a malfunzionamenti in determinate circostanze.
Tra le classi di errori identificabili, si possono notare problemi di escape dei caratteri speciali e di internazionalizzazione, errori nelle espressioni condizionali, uso scorretto dei comandi, problemi di gestione del tempo e delle date, e tipici errori di sintassi dei principianti. Ad esempio, la mancanza di spazi nel confronto «[[ $foo==0 ]]», la presenza di spazi in «var = 42» o la specifica del simbolo $ nell'assegnazione «$foo=42», l'uso di variabili senza virgolette «echo $1», la presenza di parentesi quadre in eccesso in «tr -cd ‘[a-zA-Z0-9]'».
Inoltre, supporta la generazione di raccomandazioni per migliorare lo stile del codice, risolvere problemi di portabilità e aumentare l'affidabilità degli script. Ad esempio, invece di «echo $[1+2]» verrà consigliato di utilizzare la sintassi «$((..))», l'istruzione ‘rm -rf «$STEAMROOT/»*’ sarà segnalata come pericolosa e in grado di eliminare la directory radice se la variabile $STEAMROOT non è impostata, e l'uso di «echo {1..10}» sarà evidenziato come incompatibile con dash e sh.
Nella nuova versione:
- Aggiunto un avviso per espressioni del tipo ‘local readonly foo’.
- Aggiunto un avviso per comandi non accessibili.
- Aggiunto un avviso per riferimenti circolari in ‘declare x=1 y=$x’.
- Aggiunto un avviso se $? è utilizzato per restituire il codice di uscita di echo, printf, [ ], [[ ]] e test.
- Aggiunta una raccomandazione per rimuovere ((..))inarray[((idx))]=val.
- Aggiunta una raccomandazione per unire le parentesi doppie nei contesti aritmetici.
- Aggiunta una raccomandazione per rimuovere le parentesi tonde nell'espressione a[(x+1)]=val.
Fonte: opennet.ru
