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 | ||
utilisateurs:david5647:tutos:bash-fonctions-liste-de-choix-pour-script-interactifs [24/03/2021 01:08] David5647 [Introduction] |
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 18: | Ligne 18: | ||
- Choix dans liste numéroté | - Choix dans liste numéroté | ||
+ | Finalement, dans la dernière partie (exemple), vous trouverez un script compilant toutes les fonctions à des fins de démonstration. | ||
+ | |||
+ | **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 72: | 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 82: | 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 124: | 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 187: | 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 211: | 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 226: | 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 |