{{tag>dev bash script option argument}}
====== 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.
* **getopts** est intégré a l’interpréteur **bash** (primitve).
* **getopt** est un binaire.
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:
* Ordre des options/paramètres
* La concaténation des options courtes
* La gestions des options courtes ou longues
===== 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 =====
* http://aplawrence.com/Unix/getopts.html
* https://www.redhat.com/sysadmin/arguments-options-bash-scripts