Si vous souhaitez uniquement un menu très simple qui affiche "en place" et que vous pouvez ensuite continuer à taper - sans aucun programme de dialogue externe sophistiqué, vous pouvez utiliser des séquences d'échappement ANSI et une simple boucle pour afficher la liste et permettre le déplacement d'un curseur par-dessus.
La réponse ici par user360154 a déjà tout ce dont vous avez besoin, mais il est aussi très sophistiqué, fait beaucoup plus que ce qui est nécessaire et, bien que le code soit aussi formaté pour être sophistiqué, il n'est pas facile à lire et à comprendre.
Voici la même approche que celle de l'utilisateur 360154 mais beaucoup plus simple :
function choose_from_menu() {
local prompt="$1" outvar="$2"
shift
shift
local options=("$@") cur=0 count=${#options[@]} index=0
local esc=$(echo -en "\e") # cache ESC as test doesn't allow esc codes
printf "$prompt\n"
while true
do
# list all options (option list is zero-based)
index=0
for o in "${options[@]}"
do
if [ "$index" == "$cur" ]
then echo -e " >\e[7m$o\e[0m" # mark & highlight the current option
else echo " $o"
fi
index=$(( $index + 1 ))
done
read -s -n3 key # wait for user to key in arrows or ENTER
if [[ $key == $esc[A ]] # up arrow
then cur=$(( $cur - 1 ))
[ "$cur" -lt 0 ] && cur=0
elif [[ $key == $esc[B ]] # down arrow
then cur=$(( $cur + 1 ))
[ "$cur" -ge $count ] && cur=$(( $count - 1 ))
elif [[ $key == "" ]] # nothing, i.e the read delimiter - ENTER
then break
fi
echo -en "\e[${count}A" # go up to the beginning to re-render
done
# export the selection to the requested output variable
printf -v $outvar "${options[$cur]}"
}
Voici un exemple d'utilisation :
selections=(
"Selection A"
"Selection B"
"Selection C"
)
choose_from_menu "Please make a choice:" selected_choice "${selections[@]}"
echo "Selected choice: $selected_choice"
Qui devrait ressembler à ceci :
![demo]()