183 votes

Comment puis-je créer un menu de sélection dans un Shell Shell ?

Je suis en train de créer un simple bash script et je veux y créer un menu de sélection, comme ceci :

$./script

echo "Choose your option:"

1) Option 1  
2) Option 2  
3) Option 3  
4) Quit  

Et selon le choix de l'utilisateur, je veux que différentes actions soient exécutées. Je suis un noob du scripting bash Shell, j'ai cherché des réponses sur le web, mais je n'ai rien obtenu de vraiment concret.

1voto

FooLman Points 175

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

-1voto

Lorin Hochstein Points 11816

Si vous souhaitez utiliser un simple menu Shell Shell (pas d'interface utilisateur fantaisiste), consultez l'exemple de menu suivant http://www.tldp.org/LDP/abs/html/testbranch.html .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X