Bash : modèle de script

Anne bash heredoc

Quelques notes pour bien commencer un script bash.

Aide

Il faut toujours commencer par la fonction d’aide. Ça sert aussi de documentation pour celui qui veut lire le script.

help() {
  cat <<-DOC
        Un peu de doc pour expliquer ce que fait le script,
        comment on l'utilise, présenter les options, etc.
DOC
}

Ci-dessus, on utilise - devant DOC pour pourvoir indenter le texte (par des <TAB> uniquement); ceux-ci seront ignoré à l’affichage.

Gérer les arguments

Normaliser les options avec getopt

L’utilisation de getopt permet de normaliser les options pour un traitement plus simple par la suite. Un message d’erreur est émit si on utilise des options non déclarée, sauf si la liste des options courte commence par :. Le : après une option (courte ou longue) signale qu’elle attend un argument (comme pour les options -m et --mode ci-dessous). On peut utiliser :: si l’argument est optionnel (comme pour les options -v et --verbose ci-dessous).

options=$(getopt -o hv:ⓜ --long help,verbose::,mode: -- "$@")
if [ $? != 0 ] ; then exit 1 ; fi
eval set -- "$options"

La dernière ligne remplace les arguments initiaux par la version pré-traitée par getopt. Outre la vérification, il s’est occupé de mettre toutes les options en premier, suivi par --, puis les autres arguments. Il a aussi géré les arguments optionnels des options.

Les options suivantes sont valides :

  • --mode=2
  • --mode 2
  • -m 2
  • -m2
  • --verbose=2
  • -v2

Par contre, celle-ci ne le sont pas pour une option avec un argument optionnel :

  • --verbose 2
  • -v 2

Traiter les options

Que l’on ait ou non utilisé getopt pour pré-traiter les arguments, il faut utiliser une boucle pour traiter les options. Ci-dessous, on suppose que getopt s’est occupé de la gestion d’erreurs.

while true; do
  case "$1" in
    -h | --help ) help ; exit 0 ;;
    -v | --verbose )
      case "$2" in
        "") verbose=1 ; shift 2 ;;
        *) verbose=$2 ; shift 2 ;;
      esac ;;
    -m | --mode ) mode="$2" ; shift 2 ;;
    -- ) shift; break ;;
  esac
done

Il faut éventuellement gérer les arguments restants. Par exemple, si on n’attend pas d’autres arguments que les options, on peut vérifier qu’il n’y en a effectivement pas :

if [ $# -ne 0 ] ; then
  echo "ERREUR: arguments parasites: $@"
  echo "Utiliser l'option --help pour plus d'information."
  exit 2
fi

Voir aussi :