Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:david5647:tutos:bash-gerer-les-parametres [24/03/2021 00:38] David5647 [Introduction] |
utilisateurs:david5647:tutos:bash-gerer-les-parametres [24/03/2021 17:04] David5647 [Introduction] |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
* Objet : Gérer des paramètres utilisateur | * Objet : Gérer des paramètres utilisateur | ||
- | * Niveau requis : FIXME {{tag>débutant avisé}} | + | * Niveau requis : {{tag> avisé}} |
* Commentaires : Créer un script acceptant des paramètres de position, nommés et booléens. | * Commentaires : Créer un script acceptant des paramètres de position, nommés et booléens. | ||
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
Ligne 78: | Ligne 78: | ||
echo "param_a = $PARAM_A" | echo "param_a = $PARAM_A" | ||
+ | </file> | ||
+ | |||
+ | ==== Paramètres nommé et court (-p) avec getopts ==== | ||
+ | |||
+ | **getopts** fait parti des buildins de bash, ce qui permet d'être sûr son implémentation (dès lors que l'on utilise bash) | ||
+ | |||
+ | **getopts** ne prend que des arguments courts (-p), qui peuvent accepter un paramètre | ||
+ | |||
+ | === Utilisation === | ||
+ | |||
+ | <code user>./getopts_simple.sh -v -a val_a -b val_b -o </code> | ||
+ | <code>a=val_a | ||
+ | b=val_b | ||
+ | option_o=true</code> | ||
+ | |||
+ | === Script === | ||
+ | |||
+ | <file bash getopts_simple.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # Paramètres "short" (-p) avec la build-in getopts | ||
+ | |||
+ | help_msg () { | ||
+ | echo "Usage: $(basename $0) [-h] [-v] [-a PARAM_A] [-b PARAM_B] [-o]" | ||
+ | echo 'Description' | ||
+ | echo ' -h display this help' | ||
+ | echo ' -v verbose' | ||
+ | echo ' -a PARAM_A Le paramètre A' | ||
+ | echo ' -b PARAM_B Le paramètre B' | ||
+ | echo ' -o option OPTION_O' | ||
+ | } | ||
+ | |||
+ | verbose_print () { # remplace un printf par un printf + condition | ||
+ | local MESSAGE="${@}" | ||
+ | if [[ "${VERBOSE}" == true ]];then # à condition que la variable globale $VERBOSE soit à true | ||
+ | printf "${MESSAGE}\n" | ||
+ | fi | ||
+ | } | ||
+ | |||
+ | |||
+ | # Si aucun argument donné, on affiche l'aide | ||
+ | if [[ ${#} -eq 0 ]]; then | ||
+ | help_msg | ||
+ | exit 1 | ||
+ | fi | ||
+ | # Définition des paramètres | ||
+ | optstring=":hva:b:o" # getopts cherchera les paramètres listés ('-h', 'v', 'a',...) | ||
+ | # et attendra une valeur pour ceux suivis d'un ':' (-a value_a) | ||
+ | |||
+ | # Voici la liste des variables utilisées par getopts : | ||
+ | # OPTIND => index de l'argumetn | ||
+ | # OPTARG => valeur de l'option si définie ( -a option => OPTARG="option" ) | ||
+ | # OPTERR => 0 ou 1, si egal à 1, bash affiche les messages d'erreur (à 1 par défaut en début de boucle) | ||
+ | |||
+ | OPTION_O=false | ||
+ | |||
+ | # itère sur les paramètres type "-p", | ||
+ | while getopts ${optstring} arg ; do # ne prend pas en compte les positionnel (arg) | ||
+ | # ! le type long (--long) n'est pas accépté => cas '?)' | ||
+ | case ${arg} in | ||
+ | h) # Si $arg contient la valeur "h" | ||
+ | help_msg | ||
+ | exit 0 # Quitte sans erreur | ||
+ | ;; # fin du test, ne teste pas les arguments suivant => retour en début de boucle | ||
+ | v) | ||
+ | VERBOSE='true' # variable globale à true (lue dans verbose_print) | ||
+ | verbose_print "Mode prolixe activé." | ||
+ | ;; | ||
+ | a) # Si $arg contient la valeur "a" | ||
+ | PARAM_A="${OPTARG}" # getopts à défini la variable $OPTARG qui contient le paramètre succédant à "-a" | ||
+ | ;; | ||
+ | b) | ||
+ | PARAM_B="${OPTARG}" # même chose | ||
+ | ;; | ||
+ | o) | ||
+ | OPTION_O='true' # On ne demanade pas de valeur, on passe simplement la variable à ture si l'option est présente | ||
+ | ;; | ||
+ | ?) # l'arugment n'a pas été défini | ||
+ | echo "Option invalide: -${OPTARG}." | ||
+ | echo | ||
+ | help_msg | ||
+ | echo | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | printf "a=$PARAM_A \nb=$PARAM_B \noption_o=$OPTION_O\n" | ||
+ | verbose_print "\nMessage si et seulement si drapeau '-v'" | ||
+ | </file> | ||
+ | |||
+ | ==== Paramètres nommé et court (-p) et arguments positionnels avec getopts ==== | ||
+ | |||
+ | **getops** ne gère pas les arguments positionnels, ce script permet leur implémentation | ||
+ | |||
+ | === Utilisation === | ||
+ | |||
+ | <code user>./get_opt_example.sh -v pos_1 -a val_a -b val_b -o pos_2 | ||
+ | </code> | ||
+ | <code>Mode prolixe activé. | ||
+ | a=val_a | ||
+ | b=val_b | ||
+ | option_o=true | ||
+ | positionnal= pos_1 pos_2</code> | ||
+ | |||
+ | === Script === | ||
+ | |||
+ | <file bash nom.sh> | ||
+ | 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 arguement 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 conseomme 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'" | ||
</file> | </file> | ||
==== Tout type de paramètre ==== | ==== Tout type de paramètre ==== | ||
+ | |||
+ | Pour permettre l'utilisation d'argument long (--long) ou créer une implémentation compatible POSIX, | ||
+ | on peut se passer de getopts. | ||
=== Utilisation === | === Utilisation === |