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.

214voto

Mac Points 1061
#!/bin/bash
# Bash Menu Script Example

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

Ajouter break partout où vous avez besoin de la select pour sortir. Si un break n'est pas effectuée, la select se boucle et le menu est réaffiché.

Dans la troisième option, j'ai inclus des variables qui sont définies par l'option select pour démontrer que vous avez accès à ces valeurs. Si vous le choisissez, il sera édité :

you chose choice 3 which is Option 3

Vous pouvez voir que $REPLY contient la chaîne de caractères que vous avez saisie à l'invite. Elle est utilisée comme un index dans le tableau ${options[@]} comme si le tableau était basé sur 1. La variable $opt contient la chaîne de caractères de cet index dans le tableau.

Notez que les choix peuvent être une simple liste directement dans le champ select une déclaration comme celle-ci :

select opt in foo bar baz 'multi word choice'

mais vous ne pouvez pas mettre une telle liste dans une variable scalaire à cause des espaces dans l'un des choix.

Vous pouvez également utiliser le globbing des fichiers si vous faites un choix parmi les fichiers :

select file in *.tar.gz

98voto

Alaa Ali Points 29075

Utilisation de dialog la commande ressemblerait à ceci :

dialog --clear --backtitle "Backtitle here" --title "Title here" --menu "Choose one of the following options:" 15 40 4 \\
1 "Option 1" \\
2 "Option 2" \\
3 "Option 3"

enter image description here

En le mettant dans un script :

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Backtitle here"
TITLE="Title here"
MENU="Choose one of the following options:"

OPTIONS=(1 "Option 1"
         2 "Option 2"
         3 "Option 3")

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            echo "You chose Option 1"
            ;;
        2)
            echo "You chose Option 2"
            ;;
        3)
            echo "You chose Option 3"
            ;;
esac

67voto

miguel Points 1537

Pas une nouvelle réponse en soi Mais comme il n'y a pas encore de réponse reconnue, voici quelques conseils et astuces de codage, tant pour select que pour zenity :

title="Select example"
prompt="Pick an option:"
options=("A" "B" "C")

echo "$title"
PS3="$prompt "
select opt in "${options[@]}" "Quit"; do 
    case "$REPLY" in
    1) echo "You picked $opt which is option 1";;
    2) echo "You picked $opt which is option 2";;
    3) echo "You picked $opt which is option 3";;
    $((${#options[@]}+1))) echo "Goodbye!"; break;;
    *) echo "Invalid option. Try another one.";continue;;
    esac
done

while opt=$(zenity --title="$title" --text="$prompt" --list \
                   --column="Options" "${options[@]}")
do
    case "$opt" in
    "${options[0]}") zenity --info --text="You picked $opt, option 1";;
    "${options[1]}") zenity --info --text="You picked $opt, option 2";;
    "${options[2]}") zenity --info --text="You picked $opt, option 3";;
    *) zenity --error --text="Invalid option. Try another one.";;
    esac
done

A noter :

  • Les deux tourneront en boucle jusqu'à ce que l'utilisateur choisisse explicitement Quitter (ou Annuler pour zenity). C'est une bonne approche pour les menus interactifs script : après qu'un choix ait été sélectionné et une action effectuée, le menu est présenté à nouveau pour un autre choix. Si le choix est censé être unique, utilisez simplement break nach esac (l'approche de zenity pourrait également être réduite davantage)

  • Les deux sites case sont basés sur l'indice, plutôt que sur la valeur. Je pense que c'est plus facile à coder et à maintenir

  • Le tableau est également utilisé pour zenity approche.

  • L'option "Quitter" ne fait pas partie des options initiales, originales. Elle est "ajoutée" en cas de besoin, pour que votre tableau reste propre. Après tout, "Quitter" n'est pas nécessaire pour zenity, l'utilisateur peut simplement cliquer sur "Annuler" (ou fermer la fenêtre) pour quitter. Remarquez comment les deux utilisent le même tableau d'options intactes.

  • PS3 y REPLY Les variables peuvent no être renommé. select est codé en dur pour les utiliser. Toutes les autres variables dans script (opt, options, prompt, title) peuvent avoir les noms que vous voulez, à condition de faire les ajustements suivants

20voto

jibin Points 209

Vous pouvez utiliser ce simple script pour créer des options

#!/bin/bash
echo "select the operation \*\*\*\*\*\*\*\*\*\*\*\*"
echo "  1)operation 1"
echo "  2)operation 2"
echo "  3)operation 3"
echo "  4)operation 4"   
read n
case $n in
  1) echo "You chose Option 1";;
  2) echo "You chose Option 2";;
  3) echo "You chose Option 3";;
  4) echo "You chose Option 4";;
  \*) echo "invalid option";;
esac

17voto

ZLA Points 11

J'ai une autre option qui est un mélange de ces réponses mais ce qui la rend agréable c'est que vous n'avez qu'à appuyer sur une touche et ensuite le script continue grâce au -n l'option de lecture. Dans cet exemple, nous demandons d'arrêter, de redémarrer, ou simplement de quitter le script en utilisant ANS comme notre variable et l'utilisateur n'a qu'à appuyer sur E, R ou S. J'ai également défini la valeur par défaut sur exit, donc si on appuie sur enter, le script sortira.

#!/bin/bash
read -n 1 -p "Would you like to exit, reboot, or shutdown? (E/r/s) " ans;

case $ans in
    r|R)
        sudo reboot;;
    s|S)
        sudo poweroff;;
    *)
        exit;;
esac

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