Utilisation de shellcheck pour rechercher et corriger les erreurs de script

Contenu

Shellcheck est un excellent outil d'analyse de script shell Linux qui peut être utilisé pour détecter les erreurs de programmation courantes. Shellcheck analyse les scripts et signale les erreurs et les avertissements, comme ce que ferait un compilateur.

Qu'est que c'est Shellcheck?

Si vous êtes un développeur Linux Bash depuis un certain temps, vous avez probablement rencontré pas mal de bugs dans vos propres scripts ou dans les scripts des autres. L'introduction de bogues dans le code est susceptible de se produire lorsque les humains développent du code. Même les meilleurs développeurs peuvent parfois passer à côté d'une complexité imprévue ou d'une mise en garde dans leur code..

En bas, il n'y a pas de vrai compilateur comme, par exemple, et C ++. Malgré cela, il existe un ensemble d'outils qui peuvent être d'une grande aide lors du développement de scripts bash. Une fois qu'un tel outil est shellcheck. Cet excellent utilitaire analysera un fichier de script bash et fera des recommandations en fonction de ce qui est trouvé lors de son analyse.. C'est un peu comme avoir un compilateur pour bash.

Des outils tels que shellcheck diffèrent dans leur fonctionnement des autres outils d'exécution, par exemple, exécutez un script avec bash -x pour voir chaque commande dans le script en cours d'exécution, et cela en temps réel. La raison en est que shellcheck analysera le script (déposer) sans vraiment l'exécuter, encore équivalent à ce qu'un compilateur ferait.

Pour plus d'informations sur bash -x, vous voudrez peut-être lire Bash Automation and Scripting Basics (Partie 3), qui fait partie de la série des 3 partes Bases de l'automatisation et des scripts Bash.

installation Shellcheck

Installer Shellcheck sur votre distribution Linux basée sur Debian / Apte (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:

sudo apt install shellcheck

Installer Shellcheck sur votre distribution Linux basée sur RedHat / Miam (comme RHEL, Centos et Fedora), exécutez la commande suivante dans votre terminal:

sudo yum install shellcheck

Pressé Shellcheck

Une fois que nous avons installé shellcheck, nous pouvons faire un test simple avec un script cassé. Nous définissons d'abord notre script test.sh comme suit:

#! / poubelle / wash echo 'Bash no es wash echo Más errores para mí "et [ -d ./répertoire }; than
  echo 'sure! < start
fif

Combien de bugs pouvez-vous trouver? (Pourboire: il y a 8!).

Voyons ensuite ce que shellcheck fait de ce code:

test.sh shellcheck

Sortie Shellcheck 1

Immédiatement sur la première ligne, il trouve un problème avec le Shebang spécification. Si vous n’avez pas encore entendu parler de shebang, veuillez consulter notre partie Bash Automation and Scripting Basics 1 article. Notre ligne de jeu de mots shebang #!/bin/wash devrait être #!/bin/bash. Corrigeons cela. Émettre 1/8 fixe!

Nous allons également corriger en même temps les deux autres problèmes immédiatement reconnus par shellcheck: Avez-vous oublié de fermer cette chaîne entre guillemets simples? pour la deuxième ligne: sur place! Émettre 2/8 fixe. Pour le troisième problème, il y a un peu de confusion quant à notre/les intentions des développeurs pour le shellcheck, et c'est à prévoir, comme le ' en ligne 2 ouvre une chaîne qui ne se termine qu'en ligne 5 quand un autre ' est vu!

Comme ce troisième numéro est donc le résultat de le deuxième problème, cette exécution nous permettra de résoudre deux problèmes pour le moment. Notre script ressemble maintenant à ceci:

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

Exécutons à nouveau shellcheck après avoir effectué les corrections et voyons quelle est la sortie.

Sortie Shellcheck 2

Dans ce cas, shellcheck voit qu'un " est ouvert en ligne 3 (même si c'est au bout de la ligne, c'est en fait un ouverture guillemet double en tant que tel), et que même à la fin du script (notez la ligne 8 indication, qui n'existe pas dans notre script de 6 lignes avec une seule ligne vide après la dernière ligne. Nettoyons cette ligne vide, et corrige le problème des doubles guillemets en début de ligne 3, qui peut maintenant être facilement compris. Émettre 3/8 fixe!

Notre script ressemble maintenant à ceci:

#!/bin/bash
echo 'Bash is not wash'
echo "Plus d’erreurs pour moi"
si [ -d ./répertoire }; than
  echo 'sure! < start
fif

Réexécution de shellcheck (Notez à quel point ces étapes sont similaires à l’utilisation d’un compilateur dans d’autres langages de codage):

Sortie Bash shellcheck 3

On ne pourrait pas être plus clair; L’erreur de syntaxe mentionnée se trouvait dans cette expression if et Le test prévu pour se terminer ici. Nous ferons ce qui a été suggéré et modifierons le } À ], faire lire la ligne if [ -d ./directory ]; than. Problème 4/8 Résolu! Nous avons exécuté shellcheck à nouveau et maintenant nous sommes présentés avec ce qui suit:

sortie shellcheck 4

Un autre problème de devis unique. Nous savons déjà comment les réparer. Changement echo 'sure! < start afin de echo 'sure!' < start (Problème 5/8 Résolu!) et exécutez à nouveau shellcheck:

Départ 5 de Shellcheck

Intéressant au début, nous voyons que shellcheck ne peut pas analyser une ligne. Bien que cela puisse sembler être une lacune dans shellcheck, lire un peu plus, nous voyons que quelque part un then Vous êtes perdu. Chien! Nous avons mis than au lieu de then. Quelle erreur imprudente 😉 Il a été facilement réparé (problème 6/8 Résolu!). Notre script ressemble maintenant à ceci:

#!/bin/bash
echo 'Bash is not wash'
echo "Plus d’erreurs pour moi"
si [ -d ./répertoire ]; then
  echo 'sure!' < start
fif

Et une autre exécution de shellcheck nous fournit d’autres informations utiles:

Départ 6 de Shellcheck

Nous avons une faute fi! Ah oui fif Il ne le fera pas. Changement fif afin de fi dans la dernière ligne du script (problème 7/8) corrigé et exécuté shellcheck une fois de plus.

Départ 7 de Shellcheck

Un obstacle à la redirection. Honnêtement, je ne m’attendais pas à shellcheck pour saisir également cette erreur, puisque < il peut également être utilisé dans Bash, mais bien sûr qu’il l’a fait. En réalité, notre redirection était censée être > au lieu de <. Problème 8/8 – tous les problèmes – Résolu! Cela nous amène au script final.

#!/bin/bash
echo 'Bash is not wash'
echo "Plus d’erreurs pour moi"
si [ -d ./répertoire ]; then
  echo 'sure!' > start
fi

Voyons ce que Shellcheck pense maintenant.

Sortie Shellcheck 8

Parfait! Et le script fonctionne très bien, dès la première exécution.

Si vous vérifiez la sortie de plusieurs commandes shellcheck, vous remarquerez également une autre fonctionnalité très utile de shellcheck, surtout pour les débutants: un ensemble d'hyperliens s'affiche (liens vers des sites Web), qui peut être cliqué avec la souris depuis la fenêtre du terminal, ou vous pouvez sélectionner (si c'est nécessaire)> clic droit pour copier puis coller dans un navigateur. En cliquant sur ledit lien, accédera au shellcheck du projet GitHub.

je me suis échappé?

Si vous souhaitez vérifier rapidement uniquement les alternatives les plus importantes, nous vous suggérons de jeter un oeil à la --severity={SEVERITY} option, où remplacerais-tu {SEVERITY} avec l'un des error, warning, info, style.

Pour cela, si vous cherchez juste des erreurs et des avertissements, voudrais utiliser --severity=warning (y compris les niveaux supérieurs, dans cette circonstance seulement error) en option pour shellcheck.

Fin

S'il n'y a pas de problèmes avec la logique dans un script, Cours shellcheck avant d'exécuter le script et de corriger tous les problèmes détectés, une exécution quasi parfaite sera assurée du premier coup. Vous pouvez même utiliser shellcheck sur ce défi de codage pour votre prochaine interview de codage bash en direct !! Dans cet article, nous explorons divers problèmes pouvant survenir dans les scripts et comment shellcheck les gère.

Profitez de scripts sans erreur!

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.