Conseils pour l'écriture de scripts Shell

Responsables : Jean-Patrick Gelas, Nicolas Louvet

Version : 0.1a (09/2021)


Objectif : L'objectif de cette fiche est de vous donner une liste de recommandations a appliquer lorsque vous rédigez des scripts Shell. Rien ne vous oblige à suivre ces conseils. Ce ne sont que de bonnes pratiques que l'on vous recommande de mettre en oeuvre mais qui peuvent parfois prêter à discussion.

Utilisez Bash

Pour intepréter vos scripts utilisez bash plutôt que ses alternatives tel que ksh, zsh,... Quelle que soit la distribution Linux que vous utiliserez (ou version de MacOS) vous serez quasi sûr de trouver un interpréteur bash déjà installé.

Spécifiez un shebang

Spécifiez un shebang sur la toute première ligne du fichier contenant votre script. Préférez #!/usr/bin/env bash a #!/usr/bin/bash ou #!/bin/bash.

#!/usr/bin/env bash
...

Variables et accolades

Lorsque vous appelez une variable vous pouvez l'entourer d'accolades (${...}). Ce n'est pas indispensable sauf quand il n'y a pas d'espace entre votre variable et des chaines de caractères qui la préfixe ou/et la suffixe.

my_var="456"

echo "123${my_var}789" # affiche 123456789

N'utilisez pas les backticks

L'usage de backticks est obsolète et rend difficile la lecture du script. Utilisez plutôt le format $(...) pour éxécuter une commande par le système d'exploitation.

file_count=$(ls | wc -l)
echo "Il y a $file_count fichiers dans votre répertoire."

Préférez le then sur la même ligne

Le caractère point-virgule (;) permet d'enchainer séquentiellement plusieurs instructions. Utile en ligne de commande, il est fortement recommandé de ne pas l'utiliser dans un script. Néanmoins pour l'instruction conditionnel (if) vous pouvez l'utiliser. La raison est purement esthétique...

if true ; then
    ...
else
    ...
fi

Utilisez l'instruction [ plutôt que test

Tout d'abord il est important de comprendre que le caractère crochet ouvrant est une instruction. Il doit donc être absolument suivi d'un caractère espace. C'est encore un choix purement esthétique, néanmoins je trouve que cela facilite la lecture du script.

# Préférez cette syntaxe
if [ -e lockfile.lck ]; then
    ...
fi

# plutôt que
if test -e lockfile.lck; then
    ...
fi


Créez une fonction main()

Contrairement à d'autres langages le point d'entré de votre script (i.e. la première instruction exécutée) n'est pas explicite en bash. Nous vous conseillons donc d'avoir systématiquement une fonction main() qui sera appelée immédiatement après.

#!/usr/bin/env bash

main() {
    ...
}

main

Nommez avec du sens

Prenez le temps de nommer vos fonctions et variables avec des noms qui ont du sens. Un nom un peu long n'est pas gênant. Il rend la lecture de votre script facile et agréable. Et par conséquent l'ajout de commentaires n'est plus strictement nécessaire, bien au contraire. Un code avec des variables bien nommées est plus clair et communicatif qu’un "bon" code fortement commenté.

Pour les fonctions utilisez des verbes (ex: doThis, getThat, find, calculate,...). Pour les variables utilisez des noms (ex: point, player, randomNumber,...).

NB: Notez que ce conseil s'applique à n'importe quel langage de programmation.

Pour aller plus loin

mkdir l'option -p et les accolades

Il est possible de créer une arborescence complexe en une seule ligne.

mkdir -p dir/{subdir1,subdir2/{subsubdir2.1,subsubdir2.2}}


$ find dir # pour vérifier...
dir

dir/subdir1

dir/subdir2
dir/subdir2/subsubdir2.2
dir/subdir2/subsubdir2.1