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

Supporta l'identificazione sia degli errori di sintassi, che causano l'uscita di un errore dall'interprete al momento dell'esecuzione, sia dei 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 causare malfunzionamenti in determinate circostanze.
Tra le classi di errori identificabili, si possono notare problemi con l'escensione dei caratteri speciali e la loro immissione tra virgolette, errori in espressioni condizionali, uso errato dei comandi, problemi di gestione del tempo e delle date, e tipici errori di sintassi da principianti. Ad esempio, l'assenza di spazi quando si confronta «[[ $foo==0 ]]», la presenza di spazi «var = 42» o l'assegnazione del simbolo $ quando si scrive «$foo=42», l'uso di variabili senza virgolette «echo $1», l'uso di parentesi quadre eccessive in «tr -cd ‘[a-zA-Z0-9]'».
Inoltre, viene supportata l'emissione di raccomandazioni per migliorare lo stile del codice, risolvere problemi di portabilità e aumentare l'affidabilità del funzionamento degli script. Ad esempio, invece di «echo $[1+2]» si consiglia di utilizzare la sintassi «$((..))», la costruzione ‘rm -rf «$STEAMROOT\/»*’ sarà segnalata come non sicura e capace di eliminare la directory radice se la variabile $STEAMROOT non è impostata, mentre l'uso di «echo {1..10}» sarà evidenziato come incompatibile con dash e sh.
Nella nuova versione:
- Aggiunta una segnalazione per espressioni del tipo ‘local readonly foo’.
- Aggiunta una segnalazione per la non disponibilità dei comandi.
- Aggiunta una segnalazione per i riferimenti circolari in ‘declare x=1 y=$x’.
- Aggiunta una segnalazione se $? viene 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 doppie parentesi nei contesti aritmetici.
- Aggiunta una raccomandazione per rimuovere le parentesi in espressioni a[(x+1)]=val.
Fonte: opennet.ru
