Table des matières

, , , ,

Gestion des options et arguments dans les scripts Bash

Les arguments transmis au script bash courant sont accessibles via les variables $1 à $n. La variable $@ désigne l'ensemble des arguments.

getopts et getopt sont deux moyens similaires mais non identiques pour gérer de façon avancée les options et les arguments passés aux scripts.

La gestion des options n'est pas triviale si l'on souhaite un usage souple et conforme aux standards. C'est la raison d'être des outils getopts et getopt. Par exemple les différents appels du script ci-dessous devraient produire le même comportement:

$ ./mon_script -a -b -c
$ ./mon_script -abc
$ ./mon_script -b -a -c
$ ./mon_script -ba -c
$ ./mon_script -ba -c
$ ./mon_script --long-a --long-c --long-b

Les difficultés que pointe cet exemple:

Utilisation de getopts

getopts est une primitive de Bash:

type getopts
getopts est une primitive du shell

Utilisée avec les commandes while et case, elle va permettre la gestion des options et de leur argument saisis sur la ligne de commande du script.

Le détail du fonctionnement de getopts est disponible dans l'aide via help getopts. A chaque appel, getopts copie une option et son argument de la ligne de commande et les place dans des variables de travail. La boucle while permet d'appeler autant de fois que nécessaire la commande getopts afin de parcourir l'ensemble des arguments de la ligne de commande.

La commande case permet d'associer le comportement souhaité à l'option courante reconnue sur la ligne de commande.

La structure générale est donc la suivante:

# Mon script
 
# Si elle est trouvée sur la ligne de commande,
# l'option 'h' est copiée dans la variable de travail opt_name
while getopts ":h" opt_name;
do
  case $opt_name in
    h) # affiche l'aide et quitte
      echo "Ceci est mon message d'aide"
      exit 0;;
  esac
done
 
 
echo "Exécution du comportement par défaut..."
exit 0

Utilisation de getopt

Un script d'exemple est disponible au noeud /usr/share/doc/util-linux/examples/getopt-parse.bash.

Références