#!/bin/bash help_msg () { printf """ usage: script [-h] [-o] [-a NAMED_A] [-b NAMED_B] Description Paramètres optionnels -h, --help show this help message and exit -a NAMED_A, --long_a NAMED_A Le paramètre PARAM_A -b NAMED_B, --long_b NAMED_B Le paramètre PARAM_B -o, --option L'option OPTION_O """ } # get named parameters # On utilisera par la suite la fonction shift, qui "consomme" les arguments du tableau $@ # si $@ = "-a value_a --long_b value_b" # Executer : # shift # Consomme le premier argument ("-a"): # $@ = "value_a --long_b value_b" # # $# compte le nombre d'argument restants, et par conséquent est réduit de 1 à chaque "shift" # Prenons un exemple simple, "dans l'ordre d'écriture de la fonction" # Soit la commande: # # ./script.sh -a value_a --long_b value_b -o positional # # La variable $@ contient alors "-a value_a --long_ value_b -o positional" # On initialise la liste des paramètres de position POSITIONAL="" # On boucle tant qu'il y a des arguments while [ $# -gt 0 ] ; do # $# Nombre d'arguments passés en paramètre du script key="$1" # => key = "-a", le premier argument case $key in # Teste $key pour les cas suivant: -h|--help) help_msg # exécute la fonction help () exit 0 # et quitte le script ;; -a|--long_a) # la clé "-a" est reconnue PARAM_A="$2" # la valeur du paramètre PARAM_A vient juste après, soit $2 shift # consomme un argument, $@ ne contient plus que "value_a -b value_b" shift # consomme un deuxième argument, $@ = "-b value_b" ;; # On peut passer au tour suivant, avec $key prenant la valeur $1, soit "-b" -b|--long_b) # (2e tour) : $key à la valeur "-b" et est reconnue PARAM_B="$2" # Comme précédemment, on prend l'argument suivant $key/$1 soit $2 shift # Et on consomme la clé ("-b") shift # Puis la valeur du paramètres ("value_b") ;; -o|--option) # (3e tour) : la clé "-o" est reconnue OPTION_O=true # On affecte une valeur booléenne (on pourra la:tester avec [ -z OPTION_O ] par exemple ) shift # Cette fois ci on ne passe qu'un paramètres, puisqu'il n'y a pas de valeur donnée ;; *) # La clé ne correspond à aucun autre cas if ! [[ "$key" =~ "^-" ]]; then # Si elle ne commence pas par un "-" POSITIONAL="$POSITIONAL $key" # C'est un paramètre positionnel, on l'ajoute à la liste shift # On passe le paramètres (1 seul shift) else # Si la clé commence par "-" echo "Argument non défini : '$key'" # C'est quelle ne fait pas partie de la liste définie plus haut exit 1 # On arrête le programme fi esac done # FIN! Bien-sûr l'exemple est arrangé dans le "bon ordre", mais la position des arguments n'a pas d'importance. # Paramètres parsés printf "positional : $POSITIONAL \n" # Contient : "positional" printf "param_a : $PARAM_A \n" # Contient : "value_a" printf "param_b : $PARAM_B \n" # Contient : "value_b" printf "option_o : $OPTION_O \n" # Contient : "true"