optstring=":hva:b:o" OPTION_O=false while [ $# -gt 0 ]; do # Tant que $@ contient des éléments unset OPTIND # on supprime les variables $OPTIND (position de l'argument suivant dans $@) unset OPTARG # et $OPTARG définies dans le précédent tour de boucle while getopts ${optstring} arg; do # Même chose que précédemment case ${arg} in h) help_msg exit 0 ;; v) VERBOSE='true' verbose_print "Mode prolixe activé." ;; a) PARAM_A="${OPTARG}" ;; b) PARAM_B="${OPTARG}" ;; o) OPTION_O='true' ;; ?) echo "Option invalide: -${OPTARG}." echo help_msg echo ;; esac done # getopts itère jusqu'au premier argument positionnel # (c-à-d qui n'est pas sous forme '-p' ou ne correspond pas à une valeur (-p valeur)) # # Si en début de tour, # # $@ = -a value_a -b value_b arg_1 ... # # optargs s’arrête à arg_1, # on a traité 4 arguments : '-a', 'value_a', 'b' et "value_b', et getopts à défini # # OPTIND = 5 # # le prochain argument à traiter # shift $((OPTIND-1)) # On consomme 5-1 arguments avec le "shift", la liste des arguments $@ devient: # # $@ = arg_1 ... ARGS="${ARGS} $1 " # L'argument positionnel se retrouve en $1 shift # Une fois récupéré, on le consomme et on recommence la boucle jusqu'à ce qu'il n'y ai plus d'arguments done printf "a=$PARAM_A \nb=$PARAM_B \noption_o=$OPTION_O \npositionnal=$ARGS\n" verbose_print "Message si drapeau '-v'"