Utilizzo del comando `select` per stampare un menu in Bash

Sto cercando di implementare un menu semplice utilizzando select comando. Lo script (a scopo di test) è il seguente:

#!/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 "*********************" 

Lo script non riconosce alcun input valido da me fornito e stampa sempre il messaggio “opzione non valida”. Cosa sto facendo di sbagliato in questo script?

Commenti

  • Il tuo input è 1, 2 o 3, giusto?

Risposta

Il menu visualizzato da select avrà il seguente aspetto:

1) apache 2) named 3) sendmail Select an option and press Enter: 

In questo momento, inserisci ” 1 “o” 2 “o” 3 “: non digiti la parola.

Inoltre, select eseguirà un ciclo finché non vede un break, quindi vuoi questo:

 case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac 

Se vuoi consentire allutente di inserire il numero o la parola, potresti scrivere questo:

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 virgola non ha alcun significato sintattico, è lì solo per essere in grado di trovare una corrispondenza di pattern su $ REPLY variabile (che è ciò che lutente ha effettivamente digitato) o la variabile $ opt

Commenti

  • Il select il comando richiede un break, non case.
  • Grazie! Non mi rendevo conto che si trattava di opzioni numeriche. Duhh!
  • Ah, anchio programma in C e hai bisogno di un break in ogni sezione. Tuttavia, non avrai mai bisogno di un break in un blocco case … esac in uno script di shell . Può succedere così facilmente di confonderli. 🙂
  • @syntaxerror, ' hai ragione, non ' non hai bisogno di break per case. Tuttavia, è necessario un break per sfuggire al select loop.
  • @glenn jackman mi piacerebbe avere questo trasformato in un commento più utile (vedi successivo). Quindi sarebbe fantastico se acconsentissi a cancellare il tuo commento dalle 12:55. Farò lo stesso con il mio, ovviamente.

Rispondi

Il tuo $opt la variabile sarà impostata sulla parola opzione corrispondente al numero immesso dallutente. Se vuoi vedere ciò che lutente ha effettivamente digitato, guarda $REPLY.

Commenti

  • Dato che case confronta $opt con " apache ", " named " e " sendmail ", è corretto e non è necessario modificare nulla.
  • @manatwork, a meno che lOP non desideri che lutente digiti le parole " apache ", " named " o " sendmail " anziché premere 1, 2 o 3.
  • Interessante. $ REPLY contiene 1 / 2 / 3 e $ opt contiene apache / named / sendmail
  • @fred, sì, $REPLY è qualunque cosa lutente abbia digitato e, se era un numero valido, $opt sarà la parola corrispondente a quel numero.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *