Je crée un script bash simple 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 souhaite que différentes actions soient exécutées. Je suis un scripteur de script bash, j'ai cherché des réponses sur le Web, mais je n'ai rien de vraiment concret.
bash
command-line
scripts
Daniel Rodrigues
la source
la source
seq 10 | fzf
. L'inconvénient est que fzf n'est pas installé par défaut. Vous pouvez trouver fzf ici: github.com/junegunn/fzfRéponses:
Ajoutez des
break
instructions chaque fois que vous avez besoin de laselect
boucle pour sortir. Si abreak
n'est pas exécuté, l'select
instruction est bouclée et le menu est à nouveau affiché.Dans la troisième option, j'ai inclus les variables définies par l'
select
instruction afin de démontrer que vous avez accès à ces valeurs. Si vous le choisissez, il générera:Vous pouvez voir que
$REPLY
contient la chaîne que vous avez entrée à l'invite. Il est utilisé comme un index dans le tableau${options[@]}
comme si le tableau était basé sur 1. La variable$opt
contient la chaîne de cet index dans le tableau.Notez que les choix peuvent être une simple liste directement dans l’
select
énoncé suivant: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 la suppression de fichier si vous choisissez parmi les fichiers:
la source
break
qui sort de laselect
boucle. Vous pouvez ajouterbreak
n'importe où vous en avez besoin. Le manuel de Bash indique "Les commandes sont exécutées après chaque sélection jusqu'à l'exécution d'une commande d'interruption. La commande de sélection est alors terminée."./test.sh: line 9: syntax error near unexpected token
"Option 1" './test.sh: ligne 9: `" Option 1 ")'`PS3
est l'invite de laselect
commande. Il est utilisé automatiquement et ne nécessite pas de référence explicite.PS3
etselect
documentation.$options
dans lacase
déclaration au lieu des valeurs). Je pense que l’utilisation des valeurs documente mieux la fonctionnalité des sections de lacase
déclaration.Ce n'est pas une nouvelle réponse en soi , mais comme il n'y a pas encore de réponse acceptée, voici quelques conseils et astuces de codage, à la fois pour select et zenity:
À noter:
Les deux boucleront jusqu'à ce que l'utilisateur choisisse explicitement Quit (ou Annuler pour zenity). C'est une bonne approche pour les menus de script interactifs: une fois le choix sélectionné et l'action exécutée, le menu est présenté à nouveau pour un autre choix. Si le choix est censé être ponctuel, utilisez-le
break
aprèsesac
(l’approche zenity pourrait également être réduite)Les deux
case
sont basés sur des indices plutôt que sur des valeurs. Je pense que c'est plus facile à coder et à maintenirLe tableau est également utilisé pour l'
zenity
approche.L'option "Quitter" ne figure pas parmi les options initiales d'origine. Il est "ajouté" si nécessaire, afin que votre tableau reste propre. Après tout, "Quitter" n'est de toute façon 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
etREPLY
vars ne peuvent pas être renommés.select
est codé en dur pour les utiliser. Toutes les autres variables du script (opt, options, prompt, title) peuvent avoir les noms de votre choix, à condition de faire les ajustements.la source
case
structure de laselect
version que vous utilisez pour lazenity
version:case "$opt" in . . . "${options[0]}" ) . . .
( au lieu de$REPLY
et les indices1
,2
et3
).$REPLY
index et les valeurs.En utilisant
dialog
, la commande ressemblerait à ceci:En le mettant dans un script:
la source
TERMINAL=$(tty)
en haut de mon script, puis dans laCHOICE
définition de la variable que j'ai changé2>&1 >/dev/tty
pour2>&1 >$TERMINAL
éviter les problèmes de redirection si le script a été exécuté dans un contexte autre terminal.--backtitle
paramètre?Vous pouvez utiliser ce script simple pour créer des options
la source
J'ai une autre option qui est un mélange de ces réponses, mais ce qui le rend agréable est que vous n'avez qu'à appuyer sur une touche puis le script continue grâce à l'
-n
option de lecture. Dans cet exemple, nous vous invitons à arrêter, à redémarrer ou simplement à quitter le script enANS
tant que variable. L'utilisateur doit uniquement appuyer sur E, R ou S. La valeur par défaut est également définie pour quitter. Par conséquent, si vous appuyez sur la touche Entrée, le script va sortir.la source
Etant donné que ceci est destiné à Ubuntu, vous devez utiliser le backend que debconf est configuré pour utiliser. Vous pouvez trouver le backend debconf avec:
S'il dit "dialogue", il utilisera probablement
whiptail
oudialog
. Sur Lucid c'estwhiptail
.Si cela échoue, utilisez bash "select" comme expliqué par Dennis Williamson.
la source
la source
$
manque la$opt
variable dans lawhile
déclaration. Laif
déclaration est redondante. Indentation incohérente. Utilisermenu
à certains endroits où il devrait être 'show_menu.
show_menu` pourrait être placé en haut de la boucle au lieu d'être répété dans chacun d'euxcase
. Indentation incohérente. Utilisation combinée de crochets simples et doubles. Utilisation de séquences ANSI codées en dur au lieu detput
. L'utilisation de noms de variables en majuscules n'est pas recommandée.FGRED
devrait être appelébgred
. Utilisation de backticks au lieu de$()
. La définition de fonction doit être cohérente et ne pas utiliser ...\n
ne sera jamais exécuté. Peut-être plus.J'ai utilisé Zenity, qui semble toujours être présent dans Ubuntu, fonctionne très bien et dispose de nombreuses fonctionnalités. Ceci est un croquis d'un menu possible:
la source
Menu fantaisie Bash
Essayez-le d'abord, puis visitez ma page pour une description détaillée ... Pas besoin de bibliothèques ou de programmes externes comme dialog ou zenity ...
la source
Il y a déjà la même question dans serverfault répondu. La solution utilise whiptail .
la source
En supposant que vous souhaitiez utiliser un menu de script shell simple (pas d’interface utilisateur sophistiquée), consultez l’exemple de menu disponible à l’ adresse http://www.tldp.org/LDP/abs/html/testbranch.html .
la source