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
selectLa 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
breakdans chaque section. Cependant, vous naurez jamais besoin dun blocbreakdans 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
breakpourcase. Cependant, vous avez besoin dunbreakpour é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
casecompare$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,
$REPLYcorrespond à ce que lutilisateur a tapé, et sil sagissait dun nombre valide,$optsera le mot correspondant à ce nombre.