1863 Stimmen

Wie fordere ich Eingaben für Ja/Nein/Abbrechen in einem Linux-Shell-Skript ab?

Ich möchte die Eingabe in einem Shell-Skript pausieren und den Benutzer nach Entscheidungen fragen.
Die Standardfrage für die Typen Ja, Nein oder Abbrechen.
Wie kann ich das in einem typischen Bash-Prompt erreichen?

40 Stimmen

Just als Hinweis: Die Konvention für Aufforderungen besagt, dass wenn Sie eine Option [yn] präsentieren, die Großschreibung die Standardeinstellung ist, d.h. [Yn] wird standardmäßig auf "yes" und [yN] auf "no" festgelegt. Siehe ux.stackexchange.com/a/40445/43532

4 Stimmen

Jeder, der von ZSH hierher kommt, siehe diese Antwort für die Verwendung des read Befehls zur Aufforderung

2 Stimmen

Sie können auch meine zugehörige Frage/Antwort auf U&L.SE zur kanonischen Art, in bash zu pausieren, in Betracht ziehen. Die bereitgestellten Ergebnisse können einfach übertragen werden.

5voto

Miguel Punkte 395

Angeregt durch die Antworten von @Mark und @Myrddin habe ich diese Funktion für eine universelle Eingabeaufforderung erstellt

uniprompt(){
    while true; do
        echo -e "$1\c"
        read opt
        array=($2)
        case "${array[@]}" in  *"$opt"*) eval "$3=$opt";return 0;; esac
        echo -e "$opt ist kein korrekter Wert\n"
    done
}

Verwende es so:

unipromtp "Wähle eine Option: (a)-Mache eins (x)->Mache zwei (f)->Mache drei : " "a x f" selection
echo "$selection"

5voto

Ernest A Punkte 7126

Mehrfachauswahl Version:

ask () {                        # $1=Frage $2=Optionen
    # setze REPLY
    # Optionen: x=..|y=..
    while $(true); do
        printf '%s [%s] ' "$1" "$2"
        stty cbreak
        REPLY=$(dd if=/dev/tty bs=1 count=1 2> /dev/null)
        stty -cbreak
        test "$REPLY" != "$(printf '\n')" && printf '\n'
        (
            IFS='|'
            for o in $2; do
                if [ "$REPLY" = "${o%%=*}" ]; then
                    printf '\n'
                    break
                fi
            done
        ) | grep ^ > /dev/null && return
    done
}

Beispiel:

$ ask 'weiter?' 'y=ja|n=nein|m=vielleicht'
weiter? [y=ja|n=nein|m=vielleicht] g
weiter? [y=ja|n=nein|m=vielleicht] k
weiter? [y=ja|n=nein|m=vielleicht] y
$

Es wird REPLY auf y setzen (innerhalb des Skripts).

5voto

Osama Al-Maadeed Punkte 5573

Ich schlage vor, dass Sie Dialog verwenden...

Linux Apprentice: Verbessern Sie Bash-Shell-Skripte mit Dialog

Der Dialog-Befehl ermöglicht die Verwendung von Fenstern in Shell-Skripten, um ihre Verwendung interaktiver zu gestalten.

Es ist einfach und leicht zu benutzen. Es gibt auch eine Gnome-Version namens gdialog, die dieselben Parameter verwendet, aber sie GUI-Stil auf X anzeigt.

0 Stimmen

Für den Gelegenheitsleser: Werfen Sie einen Blick auf ein Snippet mit dem Dialogbefehl hier: stackoverflow.com/a/22893526/363573

4voto

Mehr generisch wäre:

function menu(){
   title="Fragezeit"
   prompt="Wählen:"
   options=("Ja" "Nein" "Vielleicht")
   echo "$title"
   PS3="$prompt"
   select opt in "${options[@]}" "Beenden/Abbrechen"; do
       case "$REPLY" in
           1 ) echo "Du hast $opt ausgewählt, was Option $REPLY ist";;
           2 ) echo "Du hast $opt ausgewählt, was Option $REPLY ist";;
           3 ) echo "Du hast $opt ausgewählt, was Option $REPLY ist";;
           $(( ${#options[@]}+1 )) ) clear; echo "Auf Wiedersehen!"; exit;;
           *) echo "Ungültige Option. Versuche es mit einer anderen.";continue;;
        esac
    done
    return
}

4voto

Roland Punkte 3869

Die absolut einfachste Lösung ist dieser Einzeiler ohne clevere Tricks:

read -p "Drücken Sie die Eingabetaste ..." y

Es erinnert an das klassische DOS Drücken Sie eine beliebige Taste, um fortzufahren, außer dass es auf die Eingabetaste wartet, nicht nur auf eine beliebige Taste.

Zugegeben, dies bietet Ihnen keine drei Optionen für Ja Nein Abbrechen, aber es ist nützlich, wenn Sie in einfachen Skripten Steuerung-C als Nein bzw. Abbrechen akzeptieren, z. B.:

#!/bin/sh
echo Sichern dieses Projekts
read -p "Drücken Sie die Eingabetaste ..." y
rsync -tavz . /media/hard_to_remember_path/backup/projects/yourproject/

weil Sie es nicht mögen, sich hässliche Befehle und Pfade merken zu müssen, aber auch keine Skripte, die zu schnell ausgeführt werden, ohne Ihnen die Möglichkeit zu geben, anzuhalten, bevor Sie feststellen, dass es nicht das Skript ist, das Sie ausführen wollten.

Das Kommandozeilenargument y ist bei sh erforderlich und kann optional verwendet werden, um die vom Benutzer eingegebene Antwort zu erhalten, bevor die Eingabetaste gedrückt wird, beispielsweise so:

echo Sie haben $y eingegeben

Mit bash können Sie das letzte Argument weglassen und einfach verwenden:

read -p "Drücken Sie die Eingabetaste ..."

1 Stimmen

y wird in read -p "drücke Enter ..." y nicht benötigt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X