Si le caractère ":" est placé en première position dans la liste des options à traiter (ligne 3), les erreurs sont gérées différemment.
En cas d'option invalide :
- getopts n'affichera pas de message d'erreur.
- la variable OPTARG sera initialisée avec la valeur de l'option incorrecte (ligne 29).
Exemple :
$ nl test_getopts_1.sh
1 #!/bin/bash
2
3 while getopts ":abcd:e:" option
4 do
5 echo "getopts a trouvé l'option $option"
6 case $option in
7 a)
8 echo "Exécution des commandes de l'option a"
9 echo "Indice de la prochaine option à traiter : $OPTIND"
10 ;;
11 b)
12 echo "Exécution des commandes de l'option b"
13 echo "Indice de la prochaine option à traiter : $OPTIND"
14 ;;
15 c)
16 echo "Exécution des commandes de l'option c"
17 echo "Indice de la prochaine option à traiter : $OPTIND"
18 ;;
19 d)
20 echo "Exécution des commandes de l'option d"
21 echo "Liste des arguments à traiter : $OPTARG"
22 echo "Indice de la prochaine option à traiter : $OPTIND"
23 ;;
24 e)
25 echo "Exécution des commandes de l'option e"
26 echo "Liste des arguments à traiter : $OPTARG"
27 echo "Indice de la prochaine option à traiter : $OPTIND"
28 ;;
29 \?)
30 echo "$OPTARG : option invalide"
31 exit 1
32 ;;
33 esac
34 done
35 echo "Analyse des options terminée"
36 exit 0
$
Le message d'erreur généré automatiquement par getopts n'apparait plus et la variable $OPTARG a été substituée par la valeur de l'option incorrecte.
Ligne 29, le "?" doit être protégé par un anti-slash pour ne pas être interprété par le shell.
$ ./test_getopts_1.sh -a -z -b -c -d toto -e tata,tutu
getopts a trouvé l'option a
Exécution des commandes de l'option a
Indice de la prochaine option à traiter : 2
getopts a trouvé l'option ?
z : option invalide
$