Jessaie dimplémenter un menu simple en utilisant 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 invalide ». Quest-ce qui ne va pas dans ce script?
Commentaires
- Votre entrée est 1, 2 ou 3, non?
Réponse
Votre menu affiché par select ressemblera à:
1) apache 2) named 3) sendmail Select an option and press Enter:
À ce stade, vous entrez » 1 « ou » 2 « ou » 3 « : vous ne saisissez pas le mot.
De plus, select
fera une boucle jusquà ce quil voit un break
, vous voulez donc ceci:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Si vous vouliez permettre à lutilisateur dentrer le numéro ou le mot, vous pouvez écrire ceci:
select opt in "${options[@]}"; do case "$opt,$REPLY" in apache,*|*,apache) do_something; break ;; named,*|*,named) do_something; break ;; sendmail,*|*,sendmail) do_something; break ;; esac done
La virgule na aucune signification syntaxique, elle est juste là pour pouvoir faire correspondre le motif sur le $ REPLY variable (qui est ce que lutilisateur a réellement tapé) ou la variable $ opt
Commentaires
- Le
select
La commande nécessite unbreak
, pascase
. - Merci! Je ne savais pas quil sagissait doptions numériques. Duhh!
- Hah, moi aussi je programme en C et, vous avez besoin dun
break
dans chaque section. Cependant, vous naurez jamais besoin dun blocbreak
dans un bloc case … esac dans un script shell . / b> Il peut arriver si facilement de les confondre. 🙂 - @syntaxerror, vous ' avez raison, vous navez ' pas besoin de
break
pourcase
. Cependant, vous avez besoin dunbreak
pour échapper à la boucleselect
. - @glenn jackman Jaimerais avoir ceci transformé en un commentaire plus utile (voir ci-dessous). Ce serait donc formidable que vous acceptiez de supprimer votre commentaire de 12 h 55. Je ferai de même avec le mien, bien sûr.
Réponse
Votre sera définie sur le mot doption correspondant au numéro que lutilisateur saisit. Si vous voulez voir ce que lutilisateur a réellement tapé, regardez $REPLY
.
Commentaires
- Étant donné que
case
compare$opt
à " apache ", " nommé " et " sendmail ", cest correct et rien ne doit être changé. - @manatwork, sauf si lOP souhaite que lutilisateur saisisse les mots " apache ", " nommé " ou " sendmail " plutôt que dappuyer sur 1, 2 ou 3.
- Intéressant. $ REPLY contient
1
/2
/3
, et $ opt contientapache
/named
/sendmail
- @fred, oui,
$REPLY
correspond à ce que lutilisateur a tapé, et sil sagissait dun nombre valide,$opt
sera le mot correspondant à ce nombre.