Tworzę prosty skrypt bash i chcę w nim utworzyć menu wyboru, takie jak to:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
I zgodnie z wyborem użytkownika chcę, aby były wykonywane różne działania. Jestem skryptem powłoki bash, szukałem odpowiedzi w Internecie, ale nie dostałem nic konkretnego.
bash
command-line
scripts
Daniel Rodrigues
źródło
źródło
seq 10 | fzf
. Wadą jest to, że FZF nie jest domyślnie instalowany. Możesz znaleźć fzf tutaj: github.com/junegunn/fzfOdpowiedzi:
Dodaj
break
instrukcje wszędzie tam, gdzie potrzebujeszselect
pętli, aby wyjść. Jeśli abreak
nie zostanie wykonane,select
instrukcja zapętli się, a menu zostanie ponownie wyświetlone.W trzeciej opcji zawarłem zmienne ustawione przez
select
instrukcję, aby wykazać, że masz dostęp do tych wartości. Jeśli go wybierzesz, wyświetli:Możesz zobaczyć, że
$REPLY
zawiera ciąg wprowadzony w wierszu polecenia. Jest on używany jako indeks tablicy,${options[@]}
tak jakby tablica była oparta na 1. Zmienna$opt
zawiera ciąg z tego indeksu w tablicy.Zauważ, że wybory mogą być prostą listą bezpośrednio w
select
wyciągu, takim jak to:ale nie można umieścić takiej listy w zmiennej skalarnej ze względu na spacje w jednej z opcji.
Możesz także użyć globowania plików, jeśli wybierasz spośród plików:
źródło
break
które wychodzi zselect
pętli. Możesz dodaćbreak
gdziekolwiek potrzebujesz. Podręcznik Bash stwierdza: „Polecenia są wykonywane po każdym zaznaczeniu, aż do wykonania polecenia przerwania, w którym to momencie polecenie wyboru zostanie zakończone”../test.sh: line 9: syntax error near unexpected token
„Opcja 1” ./test.sh: linia 9: „„ Opcja 1 ”) ''PS3
jest monitem oselect
polecenie. Jest używany automatycznie i nie wymaga jawnego odwoływania się do niego.PS3
iselect
dokumentacja.$options
wcase
instrukcji zamiast wartości). Myślę, że użycie wartości lepiej dokumentuje funkcjonalność sekcjicase
instrukcji.Nie jest to nowa odpowiedź sama w sobie , ale ponieważ nie ma jeszcze akceptowanej odpowiedzi, oto kilka porad i wskazówek dotyczących kodowania, zarówno dla select, jak i zenity:
Warte wspomnienia:
Oba będą się zapętlać, dopóki użytkownik nie wybierze Quit (lub Cancel dla zenity). Jest to dobre podejście w przypadku interaktywnych menu skryptów: po wybraniu wyboru i wykonaniu czynności ponownie pojawia się menu dla innego wyboru. Jeśli wybór ma być jednorazowy, po prostu użyj
break
poesac
(podejście zenity można jeszcze bardziej zmniejszyć)Oba
case
są oparte na indeksie, a nie na wartości. Myślę, że łatwiej jest to kodować i utrzymywaćTablica służy również do
zenity
podejścia.Opcja „Wyjdź” nie znajduje się wśród początkowych, oryginalnych opcji. W razie potrzeby jest „dodawany”, dzięki czemu macierz pozostaje czysta. W końcu „Quit” nie jest potrzebne do zenity, użytkownik może po prostu kliknąć „Cancel” (lub zamknąć okno), aby wyjść. Zauważ, że oba używają tej samej, nietkniętej tablicy opcji.
PS3
i nieREPLY
można zmienić nazwy vars . jest na stałe w użyciu. Wszystkie pozostałe zmienne w skrypcie (opcja, opcje, monit, tytuł) mogą mieć dowolne nazwy, pod warunkiem, że wykonasz odpowiednie zmianyselect
źródło
case
struktury dlaselect
wersji, której używasz dozenity
wersji:case "$opt" in . . . "${options[0]}" ) . . .
(zamiast$REPLY
i indeksów1
,2
i3
).$REPLY
indeksami i wartościami.Za
dialog
pomocą polecenia wyglądałoby to tak:Umieszczenie go w skrypcie:
źródło
TERMINAL=$(tty)
na szczycie mojego skryptu, a następnie wCHOICE
definicji zmiennej zmieniłem2>&1 >/dev/tty
aby2>&1 >$TERMINAL
uniknąć problemów przekierowania jeśli skrypt został uruchomiony w innym kontekście terminala.--backtitle
parametr?Możesz użyć tego prostego skryptu do tworzenia opcji
źródło
Mam jeszcze jedną opcję, która jest mieszanką tych odpowiedzi, ale miło jest, że wystarczy nacisnąć tylko jeden klawisz, a następnie skrypt kontynuuje dzięki
-n
opcji odczytu. W tym przykładzie monitujemy o zamknięcie, ponowne uruchomienie lub po prostu zamknięcie skryptu za pomocąANS
naszej zmiennej, a użytkownik musi tylko nacisnąć E, R lub S. Ustawiam też domyślną wartość wyjścia, więc jeśli zostanie naciśnięty klawisz Enter, skrypt wyjdzie.źródło
Ponieważ jest to ukierunkowane na Ubuntu, powinieneś używać dowolnego skonfigurowanego do tego debconf zaplecza. Możesz znaleźć backend debconf za pomocą:
Jeśli powie „dialog”, prawdopodobnie używa
whiptail
lubdialog
. Na Lucid towhiptail
.Jeśli to się nie powiedzie, użyj bash „select” zgodnie z wyjaśnieniami Dennisa Williamsona.
źródło
źródło
$
Brakuje$opt
zmiennej wwhile
instrukcji.if
Stwierdzenie jest zbędny. Niespójne wcięcie. Używaniemenu
w niektórych miejscach, w których powinno być „show_menu.
show_menu”, może być umieszczone na górze pętli zamiast powtarzania się w każdym z nichcase
. Niespójne wcięcie. Mieszanie użycia pojedynczych nawiasów kwadratowych i podwójnych. Używanie zakodowanych sekwencji ANSI zamiasttput
. Używanie nazw zmiennych wielkimi literami nie jest zalecane.FGRED
powinien zostać nazwanybgred
. Używaj backticks zamiast$()
. Definicja funkcji powinna być spójna i nie używać ...\n
nigdy nie zostanie wykonana. Być może więcej.Użyłem Zenity, która wydaje się zawsze dostępna w Ubuntu, działa bardzo dobrze i ma wiele możliwości. Oto szkic możliwego menu:
źródło
Bash fantazyjne menu
Wypróbuj najpierw, a następnie odwiedź moją stronę, aby uzyskać szczegółowy opis ... Nie potrzebujesz zewnętrznych bibliotek ani programów, takich jak dialog czy zenity ...
źródło
Nie jest już to samo pytanie w ServerFault odpowiedział. Tamtejsze rozwiązanie wykorzystuje whiptail .
źródło
Zakładając, że chcesz użyć zwykłego menu skryptowego powłoki (bez fantazyjnego interfejsu użytkownika), sprawdź przykład menu z http://www.tldp.org/LDP/abs/html/testbranch.html .
źródło