Utilizzo di shellcheck per trovare e correggere errori di script

Contenuti

Shellcheck è un ottimo strumento di analisi degli script di shell Linux che può essere utilizzato per rilevare errori di programmazione comuni. Shellcheck analizza gli script e segnala errori e avvisi, proprio come farebbe un compilatore.

Che cos'è Shellcheck?

Se sei uno sviluppatore Linux Bash da un po', probabilmente hai riscontrato una discreta quantità di bug nei tuoi script o negli script di altri. È probabile che l'introduzione di bug nel codice si verifichi quando gli esseri umani stanno sviluppando il codice. Anche i migliori sviluppatori possono perdere di volta in volta una complessità imprevista o un avvertimento nel loro codice..

in bash, non esiste un vero compilatore come, come esempio, e C ++. Nonostante questo, esiste una serie di strumenti che possono essere di grande aiuto durante lo sviluppo di script bash. Una volta che tale strumento è shellcheck. Questa eccellente utility analizzerà un file di script bash e fornirà consigli in base a ciò che viene trovato durante la sua analisi.. È un po' come avere un compilatore per bash.

Strumenti come shellcheck differiscono nel loro funzionamento da altri strumenti di runtime, ad esempio esegui uno script con bash -x per vedere ogni singolo comando nello script che viene eseguito, e questo in tempo reale. Il motivo è che shellcheck analizzerà lo script (file) senza eseguirlo effettivamente, di nuovo equivalente a quello che farebbe un compilatore.

Per maggiori informazioni su bash -x, potresti voler leggere Bash Automation and Scripting Basics (Parte 3), che fa parte della serie di 3 partes Basi di automazione e scripting di Bash.

installazione Shellcheck

Installare Shellcheck sulla tua distribuzione Linux basata su Debian / apt (come Ubuntu e Mint), esegui il seguente comando nel tuo terminale:

sudo apt install shellcheck

Installare Shellcheck sulla tua distribuzione Linux basata su RedHat / Yum (come RHEL, Centos e Fedora), esegui il seguente comando nel tuo terminale:

sudo yum install shellcheck

Di fretta Shellcheck

Una volta installato shellcheck, possiamo fare un semplice test con uno script rotto. Per prima cosa definiamo il nostro script test.sh come segue:

#! / bidone / wash echo 'Bash no es wash echo Más errores para mí "e [ -d ./directory }; than
  echo 'sure! < start
fif

How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Shellcheck output 1

Immediately on the first line it finds an issue with the shebang specificazione. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 articolo. Our pun shebang line #!/bin/wash should be #!/bin/bash. Let’s fix this. Issue 1/8 fixed!

Allo stesso tempo risolveremo anche gli altri due problemi immediatamente riconosciuti da shellcheck: Hai dimenticato di chiudere questa singola stringa tra virgolette?? per la seconda riga: a posto! Issue 2/8 fixed. Per il terzo numero c'è un po' di confusione riguardo all'intento dei nostri/degli sviluppatori di eseguire il shellcheck, e questo è prevedibile, come la ' in linea 2 apre una stringa che termina solo in linea 5 quando un altro ' è visto!

Poiché questo terzo problema è così un risultato di il secondo problema, questa corsa ci permetterà di risolvere due problemi per il momento. Il nostro script ora assomiglia a questo:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
Se [ -d ./directory }; than
  echo 'sure! < start
fif

Eseguiamo nuovamente shellcheck su questo dopo aver apportato le correzioni e vediamo qual è l'output.

Shellcheck output 2

In questo caso, shellcheck vede che a " è aperto on line 3 (anche se è alla fine della linea, in realtà è un apertura doppia virgoletta come tale), e che anche alla fine del copione (nota la linea 8 indicazione, che non esiste nel nostro script a 6 righe con una singola riga vuota dopo l'ultima riga. Ripuliamo questa riga vuota, e risolvi il problema delle doppie virgolette all'inizio della riga 3, che ora può essere facilmente compreso. Issue 3/8 fixed!

Il nostro script ora assomiglia a questo:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
Se [ -d ./directory }; than
  echo 'sure! < start
fif

Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):

Bash shellcheck output 3

Could not be clearer; The mentioned syntax error was in this if expression e Expected test to end here. We shall do as suggested and change the } to ], haciendo que la línea se lea if [ -d ./directory ]; than. ¡Problema 4/8 solucionado! Volvimos a ejecutar shellcheck y ahora se nos presenta lo siguiente:

shellcheck salida 4

Otro problema de comillas simples. Ya sabemos cómo solucionarlos. Cambiemos echo 'sure! < start per echo 'sure!' < start (¡Problema 5/8 solucionado!) y vuelva a ejecutar shellcheck una vez más:

Partenza 5 de Shellcheck

Interesante al principio, vemos que shellcheck no puede analizar una línea. Aunque esto puede parecer una deficiencia en shellcheck, leyendo un poco más, vemos que en algún lugar un then Está perdido. Cane! Hemos puesto than invece di then. Qué error tan descuidado 😉 Se solucionó fácilmente (¡problema 6/8 solucionado!). Nuestro script ahora se ve así:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
Se [ -d ./directory ]; then
  echo 'sure!' < start
fif

Y otra ejecución de shellcheck nos proporciona otra información útil:

Partenza 6 de Shellcheck

Tenemos una falta fi! Ajá si fif No lo hará. Cambiamos fif per fi en la última línea del script (guaio 7/8) se corrigió y ejecutó shellcheck una vez más.

Partenza 7 de Shellcheck

Un obstáculo de redirección. Honestamente no esperaba shellcheck para captar además este error, da < además se puede utilizar en Bash, pero seguro que lo hizo. In realtà, nuestra redirección estaba destinada a ser > invece di <. Problema 8/8 – ¡todos los problemassolucionados! Esto nos lleva al guión final.

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
Se [ -d ./directory ]; then
  echo 'sure!' > start
fi

Veamos qué piensa Shellcheck ahora.

Salida de Shellcheck 8

¡Perfecto! Y el guión funciona estupendamente, desde la primera ejecución.

Se controlli l'output di più comandi shellcheck, noterai anche un'altra caratteristica molto utile di shellcheck, soprattutto per i principianti: viene visualizzato un insieme di collegamenti ipertestuali (link a siti web), che può essere cliccato con il mouse dalla finestra del terminale, oppure puoi selezionare (se richiesto)> fare clic con il tasto destro per copiare e successivamente incollare in un browser. Cliccando su detto link, accederà al proyecto shellcheck GitHub.

sono scappato?

Se vuoi controllare rapidamente solo le alternative più importanti, ti suggeriamo di dare un'occhiata al --severity={SEVERITY} opzione, dove vorresti sostituire? {SEVERITY} con uno di error, warning, info, style.

Perché, se stai solo cercando errori e avvisi, userebbe --severity=warning (compresi i livelli superiori, solo in questa circostanza error) come opzione per shellcheck.

Fine

Se non ci sono problemi con la logica in uno script, correre shellcheck prima di eseguire lo script e correggere tutti i problemi rilevati, un'esecuzione quasi perfetta sarà assicurata al primo tentativo. Puoi persino usare shellcheck su quella sfida di codifica per la tua prossima intervista di programmazione live bash!! In questo post esploriamo vari problemi che potrebbero sorgere negli script e come shellcheck li gestisce.

Goditi script senza errori!

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.