Ich erstelle ein einfaches Bash-Skript und möchte darin ein Auswahlmenü erstellen, wie folgt:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
Und je nach Wahl des Benutzers möchte ich, dass verschiedene Aktionen ausgeführt werden. Ich bin ein Bash-Shell-Scripting-Neuling. Ich habe im Web nach Antworten gesucht, aber nichts wirklich Konkretes gefunden.
bash
command-line
scripts
Daniel Rodrigues
quelle
quelle
seq 10 | fzf
. Der Nachteil ist, dass fzf nicht standardmäßig installiert ist. Sie finden fzf hier: github.com/junegunn/fzfAntworten:
Fügen Sie
break
Anweisungen hinzu, wo immer Sie dieselect
Schleife zum Beenden benötigen . Wenn abreak
nicht ausgeführt wird, wird dieselect
Anweisung wiederholt und das Menü erneut angezeigt.In der dritten Option habe ich Variablen eingefügt, die durch die
select
Anweisung festgelegt werden, um zu demonstrieren, dass Sie Zugriff auf diese Werte haben. Wenn Sie es auswählen, wird Folgendes ausgegeben:Sie sehen, dass
$REPLY
die Zeichenfolge enthalten ist, die Sie an der Eingabeaufforderung eingegeben haben. Es wird als Index für das Array verwendet,${options[@]}
als ob das Array 1-basiert wäre. Die Variable$opt
enthält die Zeichenfolge aus diesem Index im Array.Beachten Sie, dass die Auswahlmöglichkeiten eine einfache Liste direkt in der
select
Anweisung sein können:Sie können eine solche Liste jedoch nicht in eine skalare Variable einfügen, da in einer der Auswahlmöglichkeiten Leerzeichen enthalten sind.
Sie können auch File Globbing verwenden, wenn Sie zwischen folgenden Dateien wählen:
quelle
break
aus derselect
Schleife ausbrechenden Befehl aus. Sie können hinzufügen,break
wo immer Sie es brauchen. Das Bash-Handbuch besagt: "Die Befehle werden nach jeder Auswahl ausgeführt, bis ein Unterbrechungsbefehl ausgeführt wird. Zu diesem Zeitpunkt ist der Auswahlbefehl abgeschlossen."./test.sh: line 9: syntax error near unexpected token
"Option 1" ./test.sh: Zeile 9: "Option 1")PS3
ist die Eingabeaufforderung für denselect
Befehl. Es wird automatisch verwendet und muss nicht explizit referenziert werden.PS3
undselect
Dokumentation.$options
in dercase
Anweisung anstelle der Werte verwende). Ich denke, dass die Verwendung der Werte die Funktionalität der Abschnitte dercase
Anweisung besser dokumentiert .Per se keine neue Antwort , aber da es noch keine akzeptierte Antwort gibt, finden Sie hier ein paar Tipps und Tricks zum Codieren, sowohl für Select als auch für Zenity:
Erwähnenswert:
Beide werden wiederholt, bis der Benutzer explizit Beenden (oder Abbrechen für Zenity) wählt. Dies ist ein guter Ansatz für interaktive Skriptmenüs: Nachdem eine Auswahl getroffen und eine Aktion ausgeführt wurde, wird das Menü erneut für eine andere Auswahl angezeigt. Wenn die Auswahl nur einmalig sein soll, verwenden Sie einfach
break
afteresac
(der Zenity-Ansatz könnte auch weiter reduziert werden).Beide
case
sind eher indexbasiert als wertbasiert. Ich denke, das ist einfacher zu programmieren und zu wartenArray wird auch für die
zenity
Annäherung verwendet.Die Option "Beenden" gehört nicht zu den ursprünglichen Optionen. Es wird bei Bedarf "hinzugefügt", damit Ihr Array sauber bleibt. Schließlich ist "Beenden" für Zenity sowieso nicht erforderlich. Der Benutzer kann einfach auf "Abbrechen" klicken (oder das Fenster schließen), um das Programm zu beenden. Beachten Sie, dass beide das gleiche, unberührte Optionsfeld verwenden.
PS3
undREPLY
Variablen können nicht umbenannt werden.select
ist hartcodiert, um diese zu verwenden. Alle anderen Variablen im Skript (opt, options, prompt, title) können beliebige Namen haben, sofern Sie die Anpassungen vornehmenquelle
case
Struktur für dieselect
Version , die Sie für die Verwendung vonzenity
Version:case "$opt" in . . . "${options[0]}" ) . . .
(statt$REPLY
und die Indizes1
,2
und3
).$REPLY
, Indizes und Werten zeigen.Mit
dialog
würde der Befehl so aussehen:Einfügen in ein Skript:
quelle
TERMINAL=$(tty)
oben in mein Skript eingefügt und dann in dieCHOICE
Variablendefinition geändert2>&1 >/dev/tty
habe2>&1 >$TERMINAL
, um Umleitungsprobleme zu vermeiden, wenn das Skript in einem anderen Terminalkontext ausgeführt wurde.--backtitle
Parameter?Mit diesem einfachen Skript können Sie Optionen erstellen
quelle
Ich habe noch eine Option, die eine Mischung aus diesen Antworten ist, aber das Schöne daran ist, dass Sie nur eine Taste drücken müssen und das Skript dann dank der Lesemöglichkeit fortgesetzt wird
-n
. In diesem Beispiel werden Sie aufgefordert, das Skript herunterzufahren, neu zu starten oder einfach zu beenden, indem SieANS
als Variable verwenden. Der Benutzer muss nur E, R oder S drücken. Ich habe auch die Standardeinstellung zum Beenden festgelegt. Wenn also die Eingabetaste gedrückt wird, wird das Skript ausgeführt wird verlassen.quelle
Da dies auf Ubuntu abzielt, sollten Sie das Backend verwenden, für das debconf konfiguriert ist. Sie finden das debconf-Backend heraus mit:
Wenn dort "dialog" steht, wird wahrscheinlich
whiptail
oder verwendetdialog
. Auf Lucid ist eswhiptail
.Wenn dies fehlschlägt, verwenden Sie bash "select", wie von Dennis Williamson erklärt.
quelle
quelle
$
fehlt in der$opt
Variablen in derwhile
Anweisung. Dieif
Aussage ist überflüssig. Inkonsistente Einrückung. Die Verwendung vonmenu
"show_menu.
show_menu" an einigen Stellen könnte am oberen Rand der Schleife stehen, anstatt in jeder Schleife wiederholt zu werdencase
. Inkonsistente Einrückung. Mischen von einfachen und doppelten eckigen Klammern. Verwenden von hartcodierten ANSI-Sequenzen anstelle vontput
. Die Verwendung von All-Caps-Var-Namen wird nicht empfohlen.FGRED
sollte angerufen werdenbgred
. Verwendung von Backticks anstelle von$()
. Funktionsdefinition sollte konsistent sein und nicht verwenden ...\n
wird niemals ausgeführt. Vielleicht mehr.Ich habe Zenity verwendet, das in Ubuntu immer vorhanden zu sein scheint, sehr gut funktioniert und viele Funktionen hat. Dies ist eine Skizze eines möglichen Menüs:
quelle
Ausgefallene Speisekarte
Probieren Sie es zuerst aus, und besuchen Sie dann meine Seite, um eine detaillierte Beschreibung zu erhalten. Externe Bibliotheken oder Programme wie dialog oder zenity sind nicht erforderlich.
quelle
Es ist bereits die gleiche Frage im Serverfehler beantwortet. Die Lösung dort verwendet Whiptail .
quelle
Angenommen, Sie möchten ein einfaches Shell-Skriptmenü (keine ausgefallene Benutzeroberfläche) verwenden, lesen Sie das Menübeispiel unter http://www.tldp.org/LDP/abs/html/testbranch.html .
quelle