Ich bin ein Bash-Neuling, möchte aber ein Skript erstellen, in dem der Benutzer mehrere Optionen aus einer Liste von Optionen auswählen kann.
Im Wesentlichen möchte ich etwas Ähnliches wie das folgende Beispiel:
#!/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
(Quelle: http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
Mein Skript hätte jedoch mehr Optionen, und ich möchte die Auswahl von Mehrfachwerten zulassen. So etwas in der Art:
1) Option 1
2) Option 2
3) Option 3
4) Option 4
5) Fertig
Ein Feedback zu den von ihnen ausgewählten Personen wäre ebenfalls großartig, z. B. Pluszeichen neben denen, die sie bereits ausgewählt haben. Wenn Sie beispielsweise "1" auswählen, möchten Sie zum Löschen und erneuten Drucken eine Seite erstellen:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Wenn Sie dann "3" auswählen:
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Wenn sie erneut (1) auswählen, möchte ich, dass die Option "abgewählt" wird:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Und zum Schluss, wenn Fertig gedrückt wird, möchte ich eine Liste der ausgewählten, die angezeigt werden sollen, bevor das Programm beendet wird, z. B. wenn der aktuelle Status ist:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Drücken Sie 5, um Folgendes zu drucken:
Option 2, Option 3, Option 4
... und das Skript wird beendet.
Also meine Frage - ist das in bash möglich und wenn ja, kann jemand ein Codebeispiel bereitstellen?
Jeder Rat wäre sehr dankbar.
Wenn Sie denken
whiptail
, dass es komplex ist, dann handelt es sich hier um einen reinen Bash-Code, der genau das tut , was Sie wollen. Es ist kurz (~ 20 Zeilen), aber für Anfänger etwas kryptisch. Neben "+" für aktivierte Optionen wird auch eine Rückmeldung für jede Benutzeraktion angezeigt ("ungültige Option", "Option X wurde aktiviert" / deaktiviert usw.).Das heißt, los geht's!
Hoffe es gefällt euch ... es war eine lustige Herausforderung, es zu schaffen :)
quelle
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
Windows verwenden!Hier ist eine Möglichkeit, genau das zu tun, was Sie möchten, indem Sie nur Bash-Funktionen ohne externe Abhängigkeiten verwenden. Es markiert die aktuelle Auswahl und ermöglicht es Ihnen, sie umzuschalten.
Ändern Sie für ksh die ersten beiden Zeilen der Funktion:
und die shebang to
#!/bin/ksh
.quelle
options=(*)
(oder andere Muster) zeigt eine Liste der Dateien im Array an. Die Herausforderung wäre dann, das Auswahlmarkierungsfeld (${opts[@]}
) zusammen mit diesem zu komprimieren. Es kann mit einerfor
Schleife durchgeführt werden, aber es müsste für jeden Durchgang durch die äußerewhile
Schleife ausgeführt werden. Vielleicht möchten Sie die Verwendung vondialog
oder erwägen,whiptail
wie ich in meiner anderen Antwort erwähnt habe - obwohl dies externe Abhängigkeiten sind.${opts[@]}
speichern (oder die Zeichenfolge verwenden und speichern, die statt als zusätzliches Argument an die Funktion übergeben wurde+
).Ich habe eine Bibliothek namens Fragebogen geschrieben , eine Mini-DSL zum Erstellen von Kommandozeilen-Fragebögen. Sie fordert den Benutzer auf, eine Reihe von Fragen zu beantworten, und gibt die Antworten an stdout aus.
Es macht Ihre Aufgabe wirklich einfach. Installiere es mit
pip install questionnaire
und erstelle ein Skript, zBquestions.py
so:Dann lauf
python questions.py
. Wenn Sie die Fragen beantwortet haben, werden sie auf stdout gedruckt. Es funktioniert mit Python 2 und 3, von denen mit ziemlicher Sicherheit eines auf Ihrem System installiert ist.Es kann auch viel kompliziertere Fragebögen verarbeiten, falls jemand dies tun möchte. Hier sind einige Funktionen:
quelle
Ich habe das Beispiel von MestreLion verwendet und den folgenden Code entworfen. Sie müssen lediglich die Optionen und Aktionen in den ersten beiden Abschnitten aktualisieren.
quelle
n1 SELECTION
ist der entscheidende teil, um die-n2 SELECTION
zwei Ziffern akzeptieren wird (zB 15),-n3
übernimmt drei (zB 153), usw.Hier ist eine Bash-Funktion, mit der Benutzer mehrere Optionen mit den Pfeiltasten und der Leertaste auswählen und mit der Eingabetaste bestätigen können. Es hat eine schöne Speisekarte. Ich habe es mit Hilfe von https://unix.stackexchange.com/a/415155 geschrieben . Man kann es so nennen:
Das Ergebnis wird als Array in einer Variablen gespeichert, wobei der Name als erstes Argument angegeben wird. Das letzte Argument ist optional und wird verwendet, um einige Optionen standardmäßig auszuwählen. Es sieht aus wie das.
quelle
Da ich für prompt-toolkit (python), dialoguer (rust) oder inquirer (node) keine passende BASH-Alternative gefunden habe, habe ich es selbst ausprobiert:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
quelle
quelle
easybashgui
.