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
utilisateurs:david5647:tutos:bash-fonctions-liste-de-choix-pour-script-interactifs [24/03/2021 01:05]
David5647 [Fonctions]
utilisateurs:david5647:tutos:bash-fonctions-liste-de-choix-pour-script-interactifs [24/03/2021 17:53] (Version actuelle)
David5647 [Choix parmi liste numérotée]
Ligne 8: Ligne 8:
 ===== Introduction ===== ===== Introduction =====
  
-Collections de fonctions bash pour demande ​à l'​utilisateur de faire un choix parmis ​une liste et rendre vos scripts plus interactif!+Collections de fonctions bash pour demander ​à l'​utilisateur de faire un choix parmi une liste et rendre vos scripts plus interactif!
  
-Liste de choix formaté en colonnes avec choix par défaut ​(nombre de colonne et choix par défaut optionnel) +Les fonctions permettent à chaque fois de définir un choix par défault ​(si réponse vide ou incorrecte)
-<code user>​questionWithDefault "Votre choix?"​ "arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14" -d 8 -c 6 +
-</​code><​code>​ +
- ​arg1 ​    ​arg2 ​    ​arg3 ​    ​arg4 ​    ​arg5 ​    ​arg6 ​     +
- ​arg7 ​    ​arg8 ​    ​[arg9] ​  ​arg10 ​   arg11    arg12     +
- ​arg13 ​   arg14                                         +
-Votre choix? [arg9] :  +
-arg9 +
-</​code>​+
  
-Liste de choix énumérée et choix par défaut (optionnel)  +Vous trouverez:
-<code user>​numberedMenu "Votre choix?"​ "arg1 arg2 arg3 arg4 arg5" 2 +
-</​code>​ +
-<​code>​ +
-     1) arg1 +
-     2) arg2 +
-     3) arg3 +
-     4) arg4 +
-     5) arg5+
  
-Votre choix? [2] :  +  - Question binaire type Oui/Non avec exécution immédiate lors de la réponse de l'​utilisateur. 
-arg2</code>+  - Choix textuel avec un petit contrôle sur l'​affichage 
 +  - Choix dans liste numéroté
  
-Question oui/non et choix par défaut +Finalement, dans la dernière partie (exemple), ​vous trouverez un script compilant toutes les fonctions à des fins de démonstration.
-<code user>​askYesNo "​Voulez ​vous continuer ?" true +
-</​code><​code>​ +
-Voulez vous continuer ? [O/n] o +
-true</​code>​+
  
 +**bonus**: pour dé-commenter les scripts:
 +<code user> cat script.sh | sed '/​^\s*#/​d'​ | sed '​s/#​.*$//'​ > script_sans commentaires.sh
 +</​code>​
  
 ===== Question binaire ===== ===== Question binaire =====
Ligne 93: Ligne 77:
  
     # Positional argument should strictly come before named arguments     # Positional argument should strictly come before named arguments
 +    # 1er argument : Question à poser
 +    # 2e argument : Liste des options
 +    # 3e argument (optionnel) choix par défaut (sinon le premier item)
  
     QUESTION=$1     QUESTION=$1
-    read -ra OPTIONS ​ <<<​ "​$2"​ # Keep options list+    read -ra OPTIONS ​ <<<​ "​$2" ​                ​Transforme en array
  
-    if [ -n "​$3"​ ]; then+    if [ -n "​$3"​ ]; then                       # Si non donnée en entrèe => on prend le premier élément
         DEFAULT="​$3"​         DEFAULT="​$3"​
     else     else
Ligne 103: Ligne 90:
     fi     fi
  
-    # Create pattern for fstring +    # Create pattern for printf 
-    COL_SIZE=15 +    COL_SIZE=15 ​                                                                   # nombre de caractère pour chaque colonne ​ 
-    FORMAT_STRING="​%-${COL_SIZE}s %-${COL_SIZE}s %-${COL_SIZE}s %-${COL_SIZE}s\n"​+    FORMAT_STRING="​%-${COL_SIZE}s %-${COL_SIZE}s %-${COL_SIZE}s %-${COL_SIZE}s\n" ​ # 4 colonnes de $COL_SIZE caractère (méthode bourrin)
  
     # Show     # Show
-    printf "​$FORMAT_STRING"​ "​${OPTIONS[@]}"​+    printf "​$FORMAT_STRING"​ "​${OPTIONS[@]}" ​   # Mise en forme des options selon $FORMAT_STRING et affichage
  
     # Ask user     # Ask user
-    printf "​\x1b[1;​32m$QUESTION\x1b[0m"​ +    printf "​\x1b[1;​32m$QUESTION\x1b[0m" ​       # Question en gras + vert 
-    read -p " [$DEFAULT] : " -r INPUT +    read -p " [$DEFAULT] : " -r INPUT          # Demande d'​input sans aller à la ligne 
-    INPUT=${INPUT:​-${DEFAULT}}+    INPUT=${INPUT:​-${DEFAULT}} ​                # Si l'​input est vide, on rempli avec la valeur par défaut
  
     # Collect result     # Collect result
-    if [[ "​${OPTIONS[@]}"​ =~ "​$INPUT"​ ]]; then +    if [[ "​${OPTIONS[@]}"​ =~ "​$INPUT"​ ]]; then   # Si la réponse est une réponse valide, c-à-d que la valeur est présente dans $OPTIONS 
-        ANSWER=$INPUT+        ANSWER=$INPUT ​                           # On garde la valeur dans ANSWER
     else     else
-        ANSWER=$DEFAULT+        ANSWER=$DEFAULT ​                         # Sinon on prend celle par défaut
     fi     fi
 } }
Ligne 145: Ligne 132:
  
     # Positional argument should strictly come before named arguments     # Positional argument should strictly come before named arguments
 +    # 1er argument : Question à poser
 +    # 2e argument : Liste des options
 +    # -c|--columns (optionnel) Nombre de colonnes pour l'​affichage
 +    # -d|--default (optionnel) position dans la liste de l'​option à mettre par défaut
  
     QUESTION=$1     QUESTION=$1
-    read -ra OPTIONS ​ <<<​ "​$2"​ # Keep options ​list +    read -ra OPTIONS ​ <<<​ "​$2" ​         Transforme la liste d'options ​en array 
-    read -ra OPTIONS_SHOW <<<​ "​$2"​ # Same list but highlight [default value]+    read -ra OPTIONS_SHOW <<<​ "​$2" ​     Même liste, mais destinée à être modifié pour l'​affichage
  
-    POS_DEFAULT=0 # position ​of default ​argument +    POS_DEFAULT=0 ​                      ​Initialisation : position ​du choix par défaut à défaut de -d|--default 
-    NB_COLUMNS=4 # nummber of element by line to display+    NB_COLUMNS=4 ​                       Initialisation ; nombre de colonnes à défaut de paramètre -c|--columns
  
-    while [[ $# -gt 0 ]] ; do +    while [[ $# -gt 0 ]] ; do           # Tant que le nombre d'​argument ($#) n'est pas épuisé 
-        key="​$1"​+        key="​$1" ​                       # on cherche les clés correspondant aux options (-c et -d)
         case $key in         case $key in
-            -d|--default) +            -d|--default) ​              # Une fois la clé  touvée 
-            POS_DEFAULT="​$2"​ +            POS_DEFAULT="​$2" ​           # On sélectionne l'​argument qui lui succède 
-            shift # past argument+            shift                       ​on "​consomme"/​retire un argument ​de la liste $@
             ;;             ;;
-            -c|--columns)+            -c|--columns) ​              # Même chose pour l'​autre clé
             NB_COLUMNS="​$2"​             NB_COLUMNS="​$2"​
             shift             shift
             ;;             ;;
         esac         esac
-        shift # past value+        shift # past value              # On consomme un argument dans tout les cas
     done     done
  
     # Get new default option and format display     # Get new default option and format display
-    OPTIONS_SHOW[$POS_DEFAULT]="​[${OPTIONS_SHOW[$POS_DEFAULT]}]"​ +    OPTIONS_SHOW[$POS_DEFAULT]="​[${OPTIONS_SHOW[$POS_DEFAULT]}]" ​  # On entoure de [crochet] l'​option par défault 
-    DEFAULT="​${OPTIONS[$POS_DEFAULT]}"​+    DEFAULT="​${OPTIONS[$POS_DEFAULT]}" ​                            # On sauve sa valeur dans une variable
  
     # Get columns character length     # Get columns character length
-    max_length=0 +    max_length=0 ​                                      # Calcul de la taille minimum d'une colonne (toutes les options doivent tenir) 
-    for opt in ${OPTIONS[@]};​ do +    for opt in ${OPTIONS[@]};​ do                       # On itère sur les options 
-        opt_length=$(echo $opt | wc -c) +        opt_length=$(echo $opt | wc -c)                # On compte le nombre de caractères 
-        if [ $opt_length -ge $max_length ]; then +        if [ $opt_length -ge $max_length ]; then       # Si on trouve une chaîne plus grande que la précédente "plus grande", ​ 
-            max_length=$opt_length+            max_length=$opt_length ​                    # on enregistre celle nouvelle taille
         fi         fi
     done     done
-    max_length=$(($max_length+1))+    max_length=$(($max_length+1)) ​                     # 'tite marge supplémentaire
  
-    # Create pattern for fstring +    # Create pattern for printf 
-    FORMAT_STRING=""​ +    FORMAT_STRING="" ​                                     # préparation de la mise en forme de l'​affichage ​ 
-    for i in $(seq $NB_COLUMNS);​ do  +    for i in $(seq $NB_COLUMNS);​ do                       # On concatène "le nombre de colonnes"​ *  
-        FORMAT_STRING="​$FORMAT_STRING %-${max_length}s "+        FORMAT_STRING="​$FORMAT_STRING %-${max_length}s " ​ # la taille min d'une colonne
     done     done
     FORMAT_STRING="​$FORMAT_STRING \n"     FORMAT_STRING="​$FORMAT_STRING \n"
  
     # Show     # Show
-    printf "​$FORMAT_STRING"​ "​${OPTIONS_SHOW[@]}"​+    printf "​$FORMAT_STRING"​ "​${OPTIONS_SHOW[@]}" ​   # On affiche
  
     # Ask user     # Ask user
-    printf "​\x1b[1;​32m$QUESTION\x1b[0m"​ +    printf "​\x1b[1;​32m$QUESTION\x1b[0m" ​            # Un peu de couleur 
-    read -p " [$DEFAULT] : " -r INPUT +    read -p " [$DEFAULT] : " -r INPUT               # On demande une entrée à l'​utilisateur 
-    INPUT=${INPUT:​-${DEFAULT}}+    INPUT=${INPUT:​-${DEFAULT}} ​                     # Si il n'a rien rentré on substitue la valeur avec celle par défaut.
  
     # Collect result     # Collect result
-    if [[ "​${OPTIONS[@]}"​ =~ "​$INPUT"​ ]]; then +    if [[ "​${OPTIONS[@]}"​ =~ "​$INPUT"​ ]]; then      # Si la réponse est valide (dans la liste) 
-        ANSWER=$INPUT+        ANSWER=$INPUT ​                              # On garde la valeur
     else     else
-        ANSWER=$DEFAULT+        ANSWER=$DEFAULT ​                            # Sinon, on prend celle par défaut
     fi     fi
 } }
Ligne 208: Ligne 199:
  
  
-===== Choix parmi liste numérotée =====+===== Choix parmi liste numérotée ​: build-in select ===== 
 + 
 +la build-in select effectue une boucle infinie demandant de choisir parmi une liste, 
 +vous pouvez insérer une instruction **case** ou un nouveau **select** pour faire des sous menus. 
 + 
 +=== Utilisation === 
 + 
 +<file bash _> 
 +numberWithSelect "Votre choix?"​ "arg1 arg2 arg3 arg4 arg5 arg6"​ 
 +</​file>​ 
 + 
 +<​code>​Votre choix? 
 + 1) arg1 
 + 2) arg2 
 + 3) arg3 
 + 4) arg4 
 + 5) arg5 
 + 6) arg6 
 + 
 +#? 5 
 +Vous avec choisi arg5 
 +</​code>​ 
 + 
 +=== Script === 
 + 
 +<file bash numberWithSelect>​ 
 +numberWithSelect () { 
 +     
 +    QUESTION=$1 
 +    read -ra OPTIONS ​ <<<​ "​$2"​  
 + 
 +    echo $QUESTION 
 +    select ANSWER in ${OPTIONS[@]};​ do  
 +        if [ -n "​$ANSWER"​ ]; then 
 +            echo "Vous avec choisi $ANSWER"​ 
 +            break 
 +        else 
 +            echo "Il n'y a pas de tel index!"​ 
 +        fi 
 +    done 
 + 
 +
 + 
 +</​file>​ 
 + 
 + 
 +===== Choix parmi liste numérotée avec valeur par défaut ​=====
  
 ==== Utilisation ==== ==== Utilisation ====
Ligne 232: Ligne 269:
 numberedMenu () { numberedMenu () {
  
-    # $1 = question to ask +    # $1 = Question à poser 
-    # $2 = elements separted by space +    # $2 = liste des éléments séparés par un espace 
-    # S3 (optionnal) = index of defaut element+    # S3 (optionnal) = index de l'​élément par défaut
  
     QUESTION=$1     QUESTION=$1
-    read -ra OPTIONS ​ <<<​ "​$2"​ # Keep options ​list+    read -ra OPTIONS ​ <<<​ "​$2"​ # Obtention de la liste de options
  
-    if [ -n "​$3"​ ]; then+    if [ -n "​$3"​ ]; then       # Si donné par l'​utilisateur (c-à-d variable non vide)
         DEFAULT=$3         DEFAULT=$3
-    else+    else                       # Sinon, valeur par défaut
         DEFAULT=1         DEFAULT=1
     fi     fi
Ligne 247: Ligne 284:
     # Show      # Show 
     printf "​\n"​     printf "​\n"​
-    for i in $(seq ${#​OPTIONS[@]});​ do +    for i in $(seq ${#​OPTIONS[@]});​ do                        # on compte le nombre d'​options 
-        printf ' ​   %3s %s\n' "​$i)"​ "​${OPTIONS[$(($i-1))]}"​+        printf ' ​   %3s %s\n' "​$i)"​ "​${OPTIONS[$(($i-1))]}" ​  # On affiche la position dans la liste et la valeur de l'​option
     done     done
     printf '​\n'​     printf '​\n'​
  
     # ask user     # ask user
-    printf "​\x1b[1;​32m$QUESTION\x1b[0m"​ +    printf "​\x1b[1;​32m$QUESTION\x1b[0m" ​         # Un peu de couleur (gras + vert) 
-    read -p " [$DEFAULT] : " -r INPUT +    read -p " [$DEFAULT] : " -r INPUT            #​ Demande valeur sans retour à la ligne 
-    INPUT=${INPUT:​-${DEFAULT}}+    INPUT=${INPUT:​-${DEFAULT}} ​                  # Substitut par $DEFAULT si réponse vide
  
     # Collect result     # Collect result
utilisateurs/david5647/tutos/bash-fonctions-liste-de-choix-pour-script-interactifs.1616544307.txt.gz · Dernière modification: 24/03/2021 01:05 par David5647

Pied de page des forums

Propulsé par FluxBB