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.

47voto

SumoRunner Punkte 884
anfragen ()  {
  echo  -n "$1 [j/n]? "
  read antwort
  fertig="-1"
  while [ "$fertig" = '-1' ]
  do
    fertig="1"
    if [ "$antwort" = '' ];
    then
      antwort=""
    else
      case $antwort in
        j | J | ja | JA ) antwort="j";;
        n | N | nein | NEIN ) antwort="n";;
        *) fertig="-1";
           echo -n 'Ungültige Antwort -- bitte erneut eingeben:';
           read antwort;;
       esac
    fi
  done
}

... andere Dinge

anfragen "Jetzt installieren?"

...

2 Stimmen

Fügen Sie vier Leerzeichen am Anfang jeder Zeile ein, um das Formatieren des Codes beizubehalten.

10 Stimmen

Warum geben wir 'y' und 'n' als Parameter an inquire() wenn die Fallwechsel festcodiert sind? Das bedeutet nur Missbrauch. Es handelt sich um feste Parameter, die nicht änderbar sind, daher sollte das Echo in Zeile 2 lauten: echo -n "$1 [Y/N]? " Sie können nicht geändert werden, also sollten sie nicht geliefert werden.

1 Stimmen

@MyrddinEmrys Könnten Sie bitte Ihren Kommentar ausführen? Oder einen Link zu einem Artikel posten oder ein paar Stichwörter, damit ich selbst recherchieren kann.

45voto

mpen Punkte 253762

Hier ist etwas, das ich zusammengestellt habe:

#!/bin/sh

promptyn () {
    while true; do
        read -p "$1 " yn
        case $yn in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Bitte antworte mit ja oder nein.";;
        esac
    done
}

if promptyn "Ist der Himmel blau?"; then
    echo "ja"
else
    echo "nein"
fi

Ich bin Anfänger, also nimm das bitte mit einem Körnchen Salz, aber es scheint zu funktionieren.

9 Stimmen

Wenn Sie case $yn in in case ${yn:-$2} in ändern, können Sie das zweite Argument als Standardwert, Y oder N, verwenden.

1 Stimmen

Oder ändern Sie case $yn in case "${yn:-Y}", um Ja als Standardwert zu haben

0 Stimmen

Es ist schön, dass Ihr Code direkt mit if-Anweisungen funktioniert! Aber es scheint nicht zu funktionieren in Skripten, in denen set -e verwendet wird. Haben Sie eine Lösung dafür?

34voto

oHo Punkte 45335

Sie wollen:

  • Bash-Builtin-Befehle (d.h. portabel)
  • TTY überprüfen
  • Standardantwort
  • Timeout
  • Farbige Frage

Ausschnitt

do_xxxx=y                      # Im Batch-Modus => Standardantwort ist Ja
[[ -t 0 ]] &&                  # Wenn TTY => Frage stellen
read -n 1 -p $'\e[1;32m
Do xxxx? (J/n)\e[0m ' do_xxxx  # Antwort in $do_xxxx speichern
if [[ $do_xxxx =~ ^(j|J|)$ ]]  # Wenn 'j' oder 'J' oder leer
then
    xxxx
fi

Erklärungen

  • [[ -t 0 ]] && read ... => Befehl read aufrufen, wenn TTY
  • read -n 1 => Auf ein Zeichen warten
  • $'\e[1;32m ... \e[0m ' => In grün drucken
    (grün ist gut lesbar auf z.B. weißem oder schwarzem Hintergrund)
  • [[ $do_xxxx =~ ^(j|J|)$ ]] => Bash-Regex

Timeout => Standardantwort ist Nein

do_xxxx=y
[[ -t 0 ]] && {                   # Timeout 5 Sekunden (read -t 5)
read -t 5 -n 1 -p $'\e[1;32m
Do xxxx? (J/n)\e[0m ' do_xxxx ||  # read 'fällt aus' bei Timeout
do_xxxx=n ; }                     # Timeout => Antwort Nein
if [[ $do_xxxx =~ ^(j|J|)$ ]]
then
    xxxx
fi

0 Stimmen

Es scheint einen Tippfehler zu geben: > if [[ $do_xxxx =~ ^(y|Y|)$ ]] Sollte sein: if [[ $do_xxxx =~ ^(y|Y)$ ]]

28voto

Apurv Nerlekar Punkte 2290

Der einfachste Weg, dies mit der geringsten Anzahl von Zeilen zu erreichen, ist wie folgt:

read -p ": y/n/abbrechen" BEDINGUNG;

if [ "$BEDINGUNG" == "y" ]; then
   # hier etwas tun!
fi

Das if ist nur ein Beispiel: Es liegt an Ihnen, wie Sie diese Variable behandeln.

23voto

ThatLinuxGuy Punkte 239

Verwenden Sie das read Befehl:

echo Möchten Sie installieren? "(Y oder N)"

read x

# Überprüfen ob $x "y" ist
if [ "$x" = "y" ]; then
    # hier etwas tun!
fi

und dann alles andere, was Sie benötigen

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