Écriture d'un script bash

Depuis quelques semaines, j'ai pris de bonnes résolutions pour mes scripts bash. Je suis arrivé à les structurer efficacement.

Je commence tout d'abord par les variables configurables. Cela donne en gros ceci :

##### Variables configurables #####
# outils
PGDUMP=$(which pg_dump)
PSQL=$(which psql)
# cet outil
ME=`basename $0`
# répertoires de travail
DIRBASE=${REPBASE:-"/opt/${ME}"}
# fichiers temporaires
FICTMP="/tmp/${ME}.$$"
# journaux
FICLOG="$DIRBASE/${ME}.log"
FICERR="$DIRBASE/${ME}.err"
# fichiers de configuration
FICCONF=${1:"/etc/${ME}.conf"}
##### Fin des variables configurables #####

En premier lieu, les outils. Par défaut, j'indique $(which mon_outil) pour que l'emplacement système par défaut soit utilisé. Cependant, si l'utilisateur de ce script a compilé et installé lui-même cet outil dans un répertoire particulier, il peut directement modifier cette ligne en y mettant le chemin complet. Ensuite, nous avons les répertoires de travail, les fichiers temporaires, de configuration et les journaux. L'initialisation de la variable DIRBASE est intéressante : elle signifie que DIRBASE sera initialisée avec le contenu de la variable REPBASE si cette variable est déjà initialisée et que, dans le cas contraire, elle prendra la valeur /opt/${ME}. Cela a un très gros intérêt : cela me permet de modifier une variable suivant mon environnement. Je n'ai donc pas besoin de modifier le script pour que DIRBASE considère un autre répertoire de travail. FICCONF=${1:"/etc/${ME}.conf"} est un autre exemple de ce type de construction. La variable FICCONF prendra la valeur du premier argument en ligne de commande, s'il y en a un. Dans le cas contraire, FICCONF sera initialisée avec /etc/${ME}.conf. Cela me permet donc de modifier temporairement le fichier de configuration en le proposant sur la ligne de commande.

Une fois les initialisations réalisées, il faut vérifier un certain nombre de points. Par exemple, je propose à l'utilisateur de modifier certaines variables. Il est donc essentiel que je vérifie que les modifications réalisées sont valides. Voici la vérification des variables :

for variable in "PGDUMP" "PSQL" "ME" "DIRBASE" \
                "FICTMP" "FICLOG" "FICERR" "FICCONF"
do
  eval valeur=\$$variable
  if test -z "$valeur"
  then
    echo "ERREUR: mauvaise configuration de la variable $variable (actuellement vide)"
    exit 1
  fi
done

Je vérifie ensuite l'existence des outils et leur « exécutabilité » :

for outil in "$PSQL" "$PGDUMP"
do
  if test ! -x "$outil"
  then
    echo "ERREUR: $outil inexistant ou non exécutable"
    exit 2
  fi
done

Ensuite, je vérifie les répertoires. Généralement, ce sont des répertoires de travail, donc, s'ils n'existent pas, il faut les créer :

if test ! -d "$DIRBASE"
then
  mkdir -p "$REP_DUMP"
  if test $? -eq 0
  then
    echo "création du répertoire de sauvegarde '$REP_DUMP'"
  else
    echo "ERREUR lors de la création du répertoire de sauvegarde '$REP_DUMP'"
    exit 3
  fi
fi

Voilà. Du coup, mes scripts comportent généralement plus de tests que de code réalisant la fonction première, mais bon, au moins, c'est assez blindé.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet