#!/bin/bash questionWithDefaultComplet () { # 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 read -ra OPTIONS <<< "$2" # Transforme la liste d'options en array read -ra OPTIONS_SHOW <<< "$2" # Même liste, mais destinée à être modifié pour l'affichage POS_DEFAULT=0 # Initialisation : position du choix par défaut à défaut de -d|--default NB_COLUMNS=4 # Initialisation ; nombre de colonnes à défaut de paramètre -c|--columns while [[ $# -gt 0 ]] ; do # Tant que le nombre d'argument ($#) n'est pas épuisé key="$1" # on cherche les clés correspondant aux options (-c et -d) case $key in -d|--default) # Une fois la clé touvée POS_DEFAULT="$2" # On sélectionne l'argument qui lui succède shift # on "consomme"/retire un argument de la liste $@ ;; -c|--columns) # Même chose pour l'autre clé NB_COLUMNS="$2" shift ;; esac shift # past value # On consomme un argument dans tout les cas done # Get new default option and format display OPTIONS_SHOW[$POS_DEFAULT]="[${OPTIONS_SHOW[$POS_DEFAULT]}]" # On entoure de [crochet] l'option par défault DEFAULT="${OPTIONS[$POS_DEFAULT]}" # On sauve sa valeur dans une variable # Get columns character length max_length=0 # Calcul de la taille minimum d'une colonne (toutes les options doivent tenir) for opt in ${OPTIONS[@]}; do # On itère sur les options opt_length=$(echo $opt | wc -c) # On compte le nombre de caractères 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 # on enregistre celle nouvelle taille fi done max_length=$(($max_length+1)) # 'tite marge supplémentaire # Create pattern for printf FORMAT_STRING="" # préparation de la mise en forme de l'affichage for i in $(seq $NB_COLUMNS); do # On concatène "le nombre de colonnes" * FORMAT_STRING="$FORMAT_STRING %-${max_length}s " # la taille min d'une colonne done FORMAT_STRING="$FORMAT_STRING \n" # Show printf "$FORMAT_STRING" "${OPTIONS_SHOW[@]}" # On affiche # Ask user printf "\x1b[1;32m$QUESTION\x1b[0m" # Un peu de couleur read -p " [$DEFAULT] : " -r INPUT # On demande une entrée à l'utilisateur INPUT=${INPUT:-${DEFAULT}} # Si il n'a rien rentré on substitue la valeur avec celle par défaut. # Collect result if [[ "${OPTIONS[@]}" =~ "$INPUT" ]]; then # Si la réponse est valide (dans la liste) ANSWER=$INPUT # On garde la valeur else ANSWER=$DEFAULT # Sinon, on prend celle par défaut fi }