J'essaye d'implémenter un menu simple en utilisant la select
commande. Le script (à des fins de test) est le suivant:
#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
case $opt in
"apache")
date
;;
"named")
echo "test"
;;
"sendmail")
echo "test 2"
;;
*) echo "invalid option";;
esac
done
echo "*********************"
Le script ne reconnaît aucune entrée valide que je donne et affiche toujours le message "option non valide". Que fais-je de mal dans ce script?
bash
shell-script
select
Sumod
la source
la source
Réponses:
Votre menu affiché par select ressemblera à:
A ce moment, vous entrez "1" ou "2" ou "3": vous ne tapez pas le mot.
En outre,
select
boucle jusqu'à ce qu'il voit unebreak
commande, vous voulez donc ceci:Si vous vouliez autoriser l'utilisateur à saisir le nombre ou le mot, vous pourriez écrire ceci:
La virgule n'a aucune signification syntaxique, elle est juste là pour pouvoir faire correspondre les motifs sur la variable $ REPLY (qui est ce que l'utilisateur a réellement tapé) ou la variable $ opt
la source
select
commande a besoin d'unbreak
, noncase
.break
dans chaque section. Cependant, vous ne serez jamais besoin d' unbreak
dans un cas ... esac bloc dans un script shell . Il peut arriver si facilement de les mélanger. :-)break
pourcase
. Cependant, vous avez besoin d'unbreak
pour échapper à laselect
boucle.Votre
$opt
variable sera définie sur le mot d'option correspondant au nombre saisi par l'utilisateur. Si vous voulez regarder ce que l'utilisateur a réellement tapé, regardez$REPLY
.la source
case
compare$opt
à "apache", "nommé" et "sendmail", il est correct et rien ne doit être changé.1
/2
/3
, et $ opt détientapache
/named
/sendmail
$REPLY
est tout ce que l'utilisateur a tapé, et s'il s'agissait d'un numéro valide, ce$opt
sera le mot correspondant à ce numéro.