Próbuję zaimplementować proste menu za pomocą select
polecenia. Skrypt (do celów testowych) wygląda następująco:
#!/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 "*********************"
Skrypt nie rozpoznaje podanych przeze mnie prawidłowych danych wejściowych i zawsze drukuje komunikat „nieprawidłowa opcja”. Co robię źle w tym skrypcie?
bash
shell-script
select
Sumod
źródło
źródło
Odpowiedzi:
Twoje menu pokazane przez select będzie wyglądać następująco:
W tym momencie wpisujesz „1”, „2” lub „3”: nie wpisujesz słowa.
Ponadto
select
będzie się zapętlać, dopóki nie zobaczybreak
polecenia, więc chcesz to:Jeśli chcesz zezwolić użytkownikowi na wpisanie numeru lub słowa, możesz napisać to:
Przecinek nie ma znaczenia składniowego, po prostu jest w stanie dopasować wzorzec albo do zmiennej $ REPLY (która faktycznie wpisał użytkownik), albo do zmiennej $ opt
źródło
select
Komenda potrzebujebreak
, niecase
.break
w każdej sekcji. Jednak nigdy nie będziesz potrzebowaćbreak
w przypadku ... esac bloku w skrypcie powłoki . Może się to zdarzyć tak łatwo, aby je pomieszać. :-)break
zacase
. Musisz jednakbreak
uciec zselect
pętli.Twoja
$opt
zmienna będzie ustawiona na słowie opcji odpowiadającej liczbie tej wejść użytkowników. Jeśli chcesz zobaczyć, co użytkownik wpisał, spójrz na$REPLY
.źródło
case
porównuje się$opt
z „apache”, „nazwany” i „sendmail”, jest to poprawne i nic nie trzeba zmieniać.1
/2
/3
, a $ opt posiadaapache
/named
/sendmail
$REPLY
jest tym, co wpisał użytkownik, a jeśli był to prawidłowy numer, to$opt
będzie to słowo odpowiadające temu numerowi.