Utilisation de la commande `select` pour imprimer un menu dans Bash

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 un break, pas case.
  • 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 bloc break 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 pour case. Cependant, vous avez besoin dun break pour échapper à la boucle select.
  • @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 contient apache / named / sendmail
  • @fred, oui, $REPLY correspond à ce que lutilisateur a tapé, et sil sagissait dun nombre valide, $opt sera le mot correspondant à ce nombre.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Deep Theme Powered by WordPress