Wie fordere ich zur Eingabe von Ja / Nein / Abbrechen in einem Linux-Shell-Skript auf?
Will ich pause Eingabe in ein shell-Skript, und fordert den Benutzer zur Auswahl. Der standard - "ja", "Nein" oder "Abbrechen" Typ-Frage. Wie kann ich dies erreichen, in einem typischen bash-Eingabeaufforderung?
InformationsquelleAutor der Frage Myrddin Emrys | 2008-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfachste und am weitesten verbreitete Methode, um Benutzereingaben an einem shell-prompt ist die
read
Befehl. Der beste Weg, um zu veranschaulichen, ist eine einfache demonstration:Andere Methode, wies darauf hin, von Steven Huwig, ist Bash ist
select
Befehl. Hier ist das gleiche Beispiel mitselect
:Mit
select
Sie nicht benötigen, zu bereinigen, die input – zeigt die verfügbaren Optionen, und geben Sie eine Zahl entsprechend Ihrer Wahl. Auch loops automatisch, so gibt es keine Notwendigkeit für einewhile true
Schleife zu wiederholen, wenn Sie geben ungültige Eingabe.Auch, überprüfen Sie bitte die ausgezeichnete Antwort von F. Hauri.
InformationsquelleAutor der Antwort Myrddin Emrys
Mindestens fünf Antworten, die für eine generische Frage.
Je nach
und wenn Sie wollen,
1. POSIX-generische Lösungen
Könnten Sie die
read
Befehl ein, gefolgt vonif ... then ... else
:(Dank Adam Katz Kommentar: Ersetzt der test oben mit ein, die mehr tragbar und vermeidet eine Gabel:)
POSIX, aber single-key-Funktion
Aber wenn Sie nicht möchten, dass der Benutzer haben, drücken Sie Zurückkönnten Sie schreiben:
(Bearbeitet: Wie @JonathanLeffler Recht deuten, speichern stty-Konfiguration könnte besser sein, als einfach die Kraft, um Sie zu sane.)
Hinweis: getestet wurde Dies unter shbashkshBindestrich und busybox!
Gleiche, aber das warten explizit für y oder n:
Mit dedizierten tools
Gibt es viele tools, die erstellt wurden, verwenden
libncurses
libgtk
libqt
oder anderen grafischen Bibliotheken. Zum Beispiel mitwhiptail
:Abhängig von Ihrem system, müssen Sie möglicherweise zu ersetzen
whiptail
mit einem anderen ähnlichen tool:wo
20
ist die Höhe des Dialogfeld die Anzahl der Zeilen und60
ist die Breite des Dialogfensters. Diese tools haben alle in der Nähe von gleichen syntax.2. Bash-spezifische Lösungen
Basic in Zeile Methode
Bevorzuge ich
case
so konnte ich sogar testen, füryes | ja | si | oui
wenn nötig...in Zeile mit einzigen Schlüssel - Funktion
Unter bash, können wir bestimmen, die Länge der beabsichtigten Eingabe für die
read
Befehl:Unter bash
read
- Befehl akzeptiert eine timeout parameter, die nützlich sein könnten.Einige tricks für speziellen Werkzeugen
Anspruchsvoller dialog-Boxen, die über einfache
yes - no
Zwecke:Fortschrittsbalken:
Kleine demo:
Mehr Probe? Haben Sie einen Blick auf Mit hexenwels für die Auswahl von USB Gerät und USB-Wechselmedien-Selektor: USBKeyChooser
5. Mit "readline" - Geschichte
Beispiel:
Dies wird eine Datei erstellen
.myscript.history
in Ihrem$HOME
Verzeichnis, als könnten Sie readline ' s Geschichte-Befehle, wie nach UntenStrg+r und andere.InformationsquelleAutor der Antwort F. Hauri
InformationsquelleAutor der Antwort Pistos
Können Sie die integrierte-in Lesen - Befehl, Verwenden Sie die
-p
option fordert den Benutzer mit einer Frage.Seit BASH4, jetzt können Sie
-i
zu empfehlen, eine Antwort, so dass der Benutzer nur das drückenreturn
eingeben :(Aber denken Sie daran, verwenden Sie die "readline" - option
-e
zu ermöglichen, Zeile Bearbeiten mit den Pfeiltasten)InformationsquelleAutor der Antwort yPhil
Bash hat wählen Sie für diesen Zweck.
InformationsquelleAutor der Antwort Steven Huwig
InformationsquelleAutor der Antwort serg
Hier ist etwas, das ich zusammengestellt habe:
Ich bin ein Anfänger, so nehmen diese mit einem Körnchen Salz, aber es scheint zu funktionieren.
InformationsquelleAutor der Antwort mpen
Sie wollen:
Snippet
Erklärungen
[[ -t 0 ]] && read ...
=> Call-Befehlread
wenn TTYread -n 1
=> Warten auf ein Zeichen$'\e[1;32m ... \e[0m '
=> Druck in grün(grün ist gut, denn lesbar auf weißem/schwarzem hintergrund)
[[ $do_xxxx =~ ^(y|Y|)$ ]]
=> bash regexTimeout => Standard-Antwort ist Nein
InformationsquelleAutor der Antwort olibre
InformationsquelleAutor der Antwort SumoRunner
Der einfachste Weg, dies zu erreichen mit der geringsten Anzahl der Zeilen ist wie folgt:
Den
if
ist nur ein Beispiel: es ist bis zu wie man damit umgehen variable.InformationsquelleAutor der Antwort Apurv Nerlekar
Diese Lösung liest ein einzelnes Zeichen und ruft eine Funktion auf eine ja-Antwort.
InformationsquelleAutor der Antwort Dennis
Verwenden Sie die
read
Befehl:und dann all die anderen Sachen, die Sie brauchen,
InformationsquelleAutor der Antwort ThatLinuxGuy
Den
-e
option ermöglicht dem Benutzer das editieren der Eingabe mit den Pfeiltasten.Wenn Sie möchten, verwenden Sie einen Vorschlag als input:
-i
option druckt einen anregenden input.InformationsquelleAutor der Antwort Jahid
Sorry für posting auf so einen alten post. Vor einigen Wochen war ich vor einem ähnlichen problem, in meinem Fall brauchte ich eine Lösung, die arbeitete auch in einem online-installer-script, z.B.:
curl -Ss https://raw.github.com/_____/installer.sh | bash
Mit
read yesno < /dev/tty
funktioniert gut für mich:Hoffe, das jemand hilft.
InformationsquelleAutor der Antwort xyz
Um einen netten ncurses-wie inputbox verwenden Sie den Befehl dialog wie diese:
Dialog-Paket ist standardmäßig installiert, zumindest mit SUSE Linux.
InformationsquelleAutor der Antwort Thorsten Staerk
Multiple-choice-version:
Beispiel:
Wird es
REPLY
zuy
(im script).InformationsquelleAutor der Antwort Ernest A
Ich schlage vor, Sie dialog benutzen...
es ist einfach und leicht zu bedienen, es gibt auch eine gnome-version namens gdialog, die den genau gleichen Parametern, aber zeigt, dass es GUI-Stil auf X.
InformationsquelleAutor der Antwort Osama Al-Maadeed
Inspiriert durch die Antworten von @Mark und @Myrddin habe ich diese Funktion für eine Universelle Aufforderung
verwenden Sie es wie diese:
InformationsquelleAutor der Antwort poxtron
Einen einfachen Weg, dies zu tun ist mit
xargs -p
oder gnuparallel --interactive
.Ich mag das Verhalten von xargs ein wenig besser, denn es führt jeden Befehl sofort nach Aufforderung wie bei anderen interaktiven unix-Befehle zu sammeln, sondern vielmehr die yesses, die am Ende ausgeführt. (Sie können Strg-C, nachdem Sie durch die, die Sie wollten.)
z.B.,
InformationsquelleAutor der Antwort Joshua Goldberg
mehr generische wäre:
InformationsquelleAutor der Antwort Alexander Löfqvist
Als ein Freund von einem one-line-Befehl, den ich verwendet die folgenden:
Geschrieben longform, es funktioniert wie folgt:
InformationsquelleAutor der Antwort ccDict
Habe ich die
case
Anweisung ein paar mal in einem solchen Szenario mit der case-Anweisung ist eine gute Möglichkeit, darüber zu gehen. Einwhile
Schleife, dass ecapsulates diecase
block, die durch eine Boolesche Bedingung, die umgesetzt werden können, um halt auch mehr Kontrolle über das Programm, und erfüllen viele weitere Anforderungen. Nachdem alle Bedingungen erfüllt wurden, einebreak
verwendet werden kann, wird die Kontrolle zurück an den Haupt-Teil des Programms. Auch zur Erfüllung anderer Bedingungen, natürlich bedingte Anweisungen Hinzugefügt werden können, begleiten die Kontrollstrukturen:case
Erklärung und möglichewhile
Schleife.Beispiel mit einer
case
Anweisung, Ihren Wunsch zu erfüllenInformationsquelleAutor der Antwort oOpSgEo
Bemerkte ich, dass niemand gepostet, eine Antwort zeigt multi-line-echo-Menü für solch einfache Benutzereingaben so, hier ist mein gehen Sie zu:
Diese Methode wurde geschrieben in der Hoffnung, dass vielleicht jemand finden es nützlich und zeitsparend.
InformationsquelleAutor der Antwort Yokai
InformationsquelleAutor der Antwort jlettvin
Einzigen Tastendruck nur
Hier ist eine längere, aber wiederverwendbaren und modularen Ansatz:
0
=ja und1
=keinezsh
undbash
.Standardmäßig auf "Nein", wenn Sie die EINGABETASTE drücken
Beachten Sie, dass die
N
ist capitalsed. Hier die EINGABETASTE gedrückt wird, akzeptieren Sie den Standardwert:Beachten Sie auch, dass
[y/N]?
wurde automatisch angehängt.Die default-Einstellung "Nein" wird akzeptiert, so dass nichts zurückgegeben wird.
Re-Eingabeaufforderung, bis Sie eine gültige Antwort gegeben:
Standardmäßig auf "ja", wenn Sie die EINGABETASTE drücken
Beachten Sie, dass die
Y
grossgeschrieben wird:Oben, ich habe nur die EINGABETASTE gedrückt, so dass der Befehl ausgeführt wurde.
Nein default auf enter - erfordern
y
odern
Hier
1
oder false zurückgegeben wurde. Beachten Sie, dass mit dieser unteren-level-Funktion, die Sie benötigen, um Ihre eigenen[y/n]?
prompt.- Code
InformationsquelleAutor der Antwort Tom Hale
Ja /Nein /Abbrechen
- Funktion
Nutzung
Bestätigen Sie mit sauberen Benutzer-Eingang
- Funktion
Nutzung
InformationsquelleAutor der Antwort Eduardo Cuomo
In Reaktion auf andere:
Brauchen Sie nicht, um anzugeben, Fall in BASH4 benutzen Sie einfach die ',,', um eine var Kleinbuchstaben. Auch ich habe eine starke Abneigung gegen putting-code auf der Innenseite des gelesenen Blocks, erhalten Sie das Ergebnis und beschäftigen sich mit ihm außerhalb des gelesenen Blocks IMO. Außerdem: ein 'q' für quit IMO. Schließlich, warum geben Sie 'ja' nur verwenden,- n1-und die y drücken.
Beispiel: der Benutzer kann durch drücken von y/n und auch q gerade beendet.
InformationsquelleAutor der Antwort Mike Q