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 unbreak
, noncase
. - 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 unbreak
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
percase
. Tuttavia, è necessario unbreak
per sfuggire alselect
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 contieneapache
/named
/sendmail
- @fred, sì,
$REPLY
è qualunque cosa lutente abbia digitato e, se era un numero valido,$opt
sarà la parola corrispondente a quel numero.