web-dev-qa-db-fra.com

Comment vérifier la syntaxe d'un script Bash sans l'exécuter?

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?

245
Tom Feiner
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.

352
andy

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.

enter image description here

À propos de ShellCheck

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!

118
dvd818

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

38
Diego Tercero
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.

24
Jeevan

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.

4
Gerald Hughes

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 - 
3
mug896

Il y a plugin BashSupport pour IntelliJ IDEA qui vérifie la syntaxe.

1
Cengiz

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

1
Elvis Ciotti