Jestem nowicjuszem, ale chciałbym utworzyć skrypt, w którym chciałbym pozwolić użytkownikowi wybrać wiele opcji z listy opcji.
Zasadniczo chciałbym coś podobnego do poniższego przykładu:
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
(Źródło: http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
Jednak mój skrypt miałby więcej opcji i chciałbym zezwolić na wybór wielokrotności. Więc coś takiego:
1) Opcja 1
2) Opcja 2
3) Opcja 3
4) Opcja 4
5) Gotowe
Znakomity byłby też odzew na wybrane przez nich osoby, np. Znaki plus obok tych, które już wybrali. Np. Jeśli wybierzesz „1”, chcę wyczyścić stronę i ponownie wydrukować:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Następnie, jeśli wybierzesz „3”:
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Ponadto, jeśli ponownie wybiorą (1), chcę, aby „odznaczyła” opcję:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
I na koniec, po naciśnięciu Gotowe, chciałbym, aby lista wybranych została wyświetlona przed wyjściem z programu, np. Jeśli aktualny stan to:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Naciśnięcie 5 powinno wydrukować:
Option 2, Option 3, Option 4
... i skrypt się kończy.
Więc moje pytanie - czy jest to możliwe w bash, a jeśli tak, to czy ktoś może dostarczyć próbkę kodu?
Wszelkie porady będą mile widziane.
Jeśli uważasz, że
whiptail
jest skomplikowany, oto kod tylko do bash, który robi dokładnie to , co chcesz. Jest krótki (~ 20 linii), ale dla początkujących jest nieco tajemniczy. Oprócz pokazywania „+” dla zaznaczonych opcji, zapewnia również informację zwrotną dla każdej akcji użytkownika („nieprawidłowa opcja”, „opcja X została zaznaczona” / niezaznaczona itp.).To powiedziawszy, proszę bardzo!
Mam nadzieję, że Ci się spodoba ... to było całkiem fajne wyzwanie :)
źródło
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
Windows!Oto sposób na robienie dokładnie tego, co chcesz, używając tylko funkcji Bash bez zewnętrznych zależności. Oznacza bieżące wybory i pozwala je przełączać.
W przypadku ksh zmień pierwsze dwa wiersze funkcji:
i shebang do
#!/bin/ksh
.źródło
options=(*)
(lub inne wzorce globowania) otrzymają listę plików w tablicy. Wyzwaniem byłoby wówczas${opts[@]}
spakowanie razem tablicy znaków wyboru ( ). Można to zrobić za pomocąfor
pętli, ale trzeba by ją uruchamiać przy każdym przejściu przez zewnętrznąwhile
pętlę. Możesz rozważyć użyciedialog
lub,whiptail
jak wspomniałem w mojej innej odpowiedzi - chociaż są to zależności zewnętrzne.${opts[@]}
i zapisać ciąg przekazany jako dodatkowy argument funkcji zamiast+
).Napisałem bibliotekę o nazwie kwestionariusz , który jest mini-DSL do tworzenia kwestionariuszy z linii poleceń. Skłania użytkownika do udzielenia odpowiedzi na szereg pytań i wypisuje odpowiedzi na standardowe wyjście.
To sprawia, że twoje zadanie jest naprawdę łatwe. Zainstaluj go
pip install questionnaire
i utwórz skrypt, na przykładquestions.py
:Potem biegnij
python questions.py
. Po zakończeniu odpowiadania na pytania są drukowane na standardowe wyjście. Działa z Python 2 i 3, z których jeden prawie na pewno jest zainstalowany w twoim systemie.Może również obsługiwać znacznie bardziej skomplikowane kwestionariusze, na wypadek, gdyby ktoś chciał to zrobić. Oto niektóre funkcje:
źródło
Skorzystałem z przykładu z MestreLion i napisałem poniższy kod. Wszystko, co musisz zrobić, to zaktualizować opcje i działania w pierwszych dwóch sekcjach.
źródło
n1 SELECTION
jest kluczowa część dla zwiększenia liczby cyfr.-n2 SELECTION
akceptuje dwie cyfry (np. 15),-n3
akceptuje trzy (np. 153) itp.Oto funkcja bash, która pozwala użytkownikowi wybrać wiele opcji za pomocą klawiszy strzałek i spacji i potwierdzić za pomocą Enter. Ma przyjemne menu. Napisałem to za pomocą https://unix.stackexchange.com/a/415155 . Można to nazwać tak:
Wynik jest przechowywany jako tablica w zmiennej o nazwie podanej jako pierwszy argument. Ostatni argument jest opcjonalny i służy do domyślnego wyboru niektórych opcji. To wygląda tak.
źródło
Ponieważ nie znalazłem żadnej odpowiedniej alternatywy BASH dla zestawów narzędzi (python), dialoguer (rdza) lub pytających (węzeł), spróbowałem samodzielnie:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
źródło
źródło
easybashgui
.