logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 ===
utilisateurs/david5647/tutos/bash-gerer-les-parametres.txt · Dernière modification: 24/03/2021 17:20 par David5647

Pied de page des forums

Propulsé par FluxBB