Analyser les options d’un script avec « getopts »

Samuel Chevalley
13 juin 2016

La commande interne getopts permet à un script d’analyser les options passées en argument.Pour vérifier la validité de chacune des options, il faut appeler getopts à partir d’une boucle.
 
Le script suivant est un exemple d’utilisation de getopts :

 1 #!/bin/bash
 2 function help
 3 {
 4 echo -e "\nUsage : toto.sh -n name -a age [-h help]\n"
 5 exit 1
 6 }

 7 testNAME=0
 8 testAGE=0

 9 [ "`echo $*`" = "" ] && help && exit 1
 10 while getopts hn:a: option
 11 do
 12      echo "getopts a trouvé l'option $option"
 13      case $option in
 14           h)
 15           echo "Exécution des commandes de l'option h"
 16           echo "Liste des arguments à traiter : $OPTARG"
 17           help
 18           ;;
 19     
 20           n)
 21           NAME=$OPTARG
 22           testNAME=1
 23           echo "Exécution des commandes de l'option n"
 24           echo "Liste des arguments à traiter : $OPTARG"
 25           ;;

 26           a)
 27           AGE=$OPTARG
 28           testAGE=1
 29           echo "Exécution des commandes de l'option a"
 30           echo "Liste des arguments à traiter : $OPTARG"
 31           ;;
 32
 33           *)
 34           echo "Exécution des commandes de l'option h"
 35           echo "Liste des arguments à traiter : $OPTARG"
 36           help
 37           ;;
 38      esac
 39 done

 40 if [ $testNAME = 1 ] && [ $testAGE = 1 ]
 41 then
 42 echo "Ton nom est $NAME et tu as $AGE ans."
 43 fi

La liste des options utilisables avec ce script sont définies à la ligne 10 (getopts « hn:a: » option). Il s’agit des options -h, -n et -a.
Le caractère « : » inscrit après les options « n » et « a » indique que ces options doivent être suivies obligatoirement d’un argument.
La variable « option » permet de récupérer la valeur de l’option en cours de traitement par la boucle while.
L’option initialisé avec le caractère « * » permet de rentrer dans ce cas lorsqu’il y a une erreur au niveau de l’option donnée au script (option inexistante ou argument non renseigné), dans cette exemple on utilise la fonction « help ».
La variable réservée « $OPTARG » contient l’argument associé à l’option.

Remarque : Il y a aussi la variable réservée « $OPTIND » qui contient l’indice de la prochaine option à traiter, hn:a: => h indice 1, n=2, :=3, a=4 et :=5.
 
Exécution du script avec des options valides :

[root@test sch]# ./toto.sh -a 24 -n Sam
getopts a trouvé l'option a
Exécution des commandes de l'option a
Liste des arguments à traiter : 24
getopts a trouvé l'option n
Exécution des commandes de l'option n
Liste des arguments à traiter : Sam
Ton nom est Sam et tu as 24 ans.

 

Exécution du script avec des options invalides :

[root@test sch]# ./toto.sh -a 24 -n
getopts a trouvé l'option a
Exécution des commandes de l'option a
Liste des arguments à traiter : 24
./toto.sh: option requires an argument -- n
getopts a trouvé l'option ?
Exécution des commandes de l'option h
Liste des arguments à traiter :

Usage : toto.sh -n name -a age [-h help]


[root@test sch]# ./toto.sh -a 24 -n Sam -t
getopts a trouvé l'option a
Exécution des commandes de l'option a
Liste des arguments à traiter : 24
getopts a trouvé l'option n
Exécution des commandes de l'option n
Liste des arguments à traiter : Sam
./toto.sh: illegal option -- t
getopts a trouvé l'option ?
Exécution des commandes de l'option h
Liste des arguments à traiter :

Usage : toto.sh -n name -a age [-h help]

Lorsque la commande getopts détecte une option invalide, la variable option est initialisée avec la caractère « ? » et un message d’erreur est affiché à l’écran.