Est-il possible de vérifier la syntaxe d'un script bash sans l'exécuter?
En utilisant Perl, je peux exécuter Perl -c 'script name'
. Existe-t-il une commande équivalente pour les scripts bash?
bash -n scriptname
Peut-être une mise en garde évidente: ceci valide la syntaxe mais ne vérifie pas si votre script bash tente d'exécuter une commande qui ne se trouve pas dans votre chemin, comme ech hello
au lieu de echo hello
.
Le temps change tout. Voici un site Web qui fournit un contrôle de syntaxe en ligne pour le script Shell.
J'ai trouvé qu'il est très puissant de détecter les erreurs courantes.
ShellCheck est un outil d'analyse statique et de linting pour les scripts sh/bash. Il se concentre principalement sur le traitement des erreurs et des pièges de syntaxe typiques des niveaux débutant et intermédiaire, dans lesquels le shell donne simplement un message d'erreur cryptique ou un comportement étrange, mais il fait également état de quelques problèmes plus avancés dans lesquels des erreurs peuvent entraîner des défaillances différées.
Le code source de Haskell est disponible sur GitHub!
J'active également l'option 'u' sur chaque script bash que j'écris afin d'effectuer des vérifications supplémentaires:
set -u
Ceci rapportera l'utilisation de variables non initialisées, comme dans le script suivant 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Lancer le script:
$ check_init.sh
Rapportera ce qui suit:
./check_init.sh[4]: message: paramètre non défini.
Très utile pour attraper des fautes de frappe
sh -n script-name
Lance ça. Si le script contient des erreurs de syntaxe, le même message d'erreur est renvoyé. S'il n'y a pas d'erreur, alors il sort sans donner de message. Vous pouvez vérifier immédiatement en utilisant echo $?
, qui retournera 0
confirmant que l'opération a abouti sans aucune erreur.
Cela a bien fonctionné pour moi. J'ai couru sous Linux, Bash Shell.
En fait, je vérifie tous les scripts bash du répertoire courant pour les erreurs de syntaxe SANS les exécuter avec l'outil find
:
Exemple:
find . -name '*.sh' -exec bash -n {} \;
Si vous souhaitez l'utiliser pour un seul fichier, éditez simplement le caractère générique avec le nom du fichier.
la commande null [deux-points] est également utile lors du débogage pour voir la valeur de la variable
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
Il y a plugin BashSupport pour IntelliJ IDEA qui vérifie la syntaxe.
Si vous avez besoin dans une variable de la validité de tous les fichiers d’un répertoire (crochet git pre-commit, script lint), vous pouvez récupérer le résultat stderr des commandes "sh -n" ou "bash -n" (voir autres réponses) dans une variable, et avoir un "if/else" basé sur cette
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Changez "sh" avec "bash" en fonction de vos besoins