{{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