Comment utiliser la commande getopts en bash ?

Getopts est une commande qui permet de contrôler les opérateurs utilisés par une commande. Voici comment l'exploiter.

Getopts est une commande qui permet de contrôler les opérateurs utilisés par une commande. Cette méthode prendra en paramètre une chaîne de caractères lui indiquant les lettres définissant les options, et pourra être parcourue dans une boucle afin de contrôler chaque argument.

Pour illustrer son utilisation, imaginons un script qui accepte deux arguments : l'un avec l'option "v", qui peut être égale à 15 ou 75 l'autre avec l'option "g". On va créer une fonction "usage" qui affiche une phrase montrant l'utilisation du script :

usage() { echo "Usage: $0 [-v <15|75>] [-p <chaîne de caractères>]" 1>&2; exit 1; }

Pour vérifier les arguments de la fonction, on va utiliser "getopts". Dans la boucle, on utilise l'instruction "case" pour vérifier la valeur de l'option saisie. Pour l'option "g", on récupère la valeur de p dans une variable grâce à la variable "OPTARG". Pour "v", on contrôle que la valeur est égale à 15 ou 75. Si ce n'est pas le cas, on appelle la fonction "usage". Pour tous les autres arguments, on les détecte avec l'opérateur "*", et on appelle la fonction "*". On décale ensuite l'ordre des paramètres avec la commande "shift". Pour vérifier que tous les paramètres sont bien saisis, on réalise un test avec l'opérateur de comparaison "-z".

while getopts ":v:g:" option; do
    case "${option}" in
        v)
            v=${OPTARG}
            ((v == 15 || v == 75)) || usage
            ;;
        g)
            g=${OPTARG}
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))
if [ -z "${v}" ] || [ -z "${g}" ]; then
    usage
fi
echo "v = ${v}"
echo "g = ${g}"

Voici des exemples d'utilisation du script :

# Sans paramètres, le message d'usage est affiché
./monscript.sh
Usage: ./monscript.sh [-v <15|75>] [-g <chaîne de caractères>]
#Usage avec un mauvais paramètre
./myscript.sh -h 1
Usage: ./monscript.sh [-v <15|75>] [-g <chaîne de caractères>]
# usage correct
$ ./myscript.sh -v 15 -g toto
v = 15
g = toto

Divers