Pokouším se implementovat jednoduché menu pomocí select
příkaz. Skript (pro účely testování) je následující:
#!/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 "*********************"
Skript nerozpoznává žádné platné vstupy, které zadám, a vždy vytiskne zprávu „neplatná volba“. Co dělám špatně v tomto skriptu?
Komentáře
- Váš vstup je 1, 2 nebo 3, že?
Odpověď
Vaše nabídka zobrazená výběrem bude vypadat takto:
1) apache 2) named 3) sendmail Select an option and press Enter:
V tuto chvíli zadáte “ 1 „nebo“ 2 „nebo“ 3 „: slovo nezadáte.
Rovněž select
bude smyčkovat, dokud neuvidí break
příkaz, takže chcete tento:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Pokud jste chtěli uživateli povolit zadání čísla nebo slovo, můžete napsat toto:
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
Čárka nemá žádný syntaktický význam, je tam jen proto, aby bylo možné vzorovat shodu na $ REPLY proměnná (což uživatel skutečně zadal) nebo proměnná $ opt
Komentáře
-
select
příkaz vyžadujebreak
, necase
. - Děkuji! Neuvědomil jsem si, že jde o numerické možnosti. Duhh!
- Hah, já taky programuji v C a potřebujete tam
break
v každé sekci. Nikdy však nebudete potřebovatbreak
v případě … esac bloku v shell skriptu . Může se to stát tak snadno, že je zamícháme. 🙂 - @syntaxerror, máte ' pravdu, ' nepotřebujete
break
procase
. K úniku ze smyčkyselect
však potřebujetebreak
. - @glenn jackman Chtěl bych mít toto se změnil na užitečnější komentář (viz dále). Bylo by skvělé, kdybyste souhlasili se smazáním komentáře od 12:55. Totéž samozřejmě udělám s mým.
Odpovědět
Vaše $opt
proměnná bude nastavena na slovo možnosti odpovídající číslu , které uživatel zadá. Pokud se chcete podívat na to, co uživatel skutečně zadal, podívejte se na $REPLY
.
Komentáře
- Vzhledem k tomu, že
case
porovnává$opt
s " apache ", " pojmenované " a " sendmail ", je to správné a nic se nemusí měnit. - @manatwork, pokud OP nechce, aby uživatel zadával slova " apache ", " s názvem " nebo " sendmail " místo stisknutí 1, 2 nebo 3.
- Zajímavé. $ REPLY obsahuje
1
/2
/3
a $ opt obsahujeapache
/named
/sendmail
- @fred, ano, je cokoli, co uživatel zadal, a pokud to bylo platné číslo, bude
$opt
slovo odpovídající tomuto číslu.