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.

3voto

jlettvin Punkte 1081
yn() {
  if [[ 'y' == `read -s -n 1 -p "[j/n]: " Y; echo $Y` ]];
  then eval $1;
  else eval $2;
  fi }
yn 'echo ja' 'echo nein'
yn 'echo abwesend nein Funktion funktioniert auch!'

0 Stimmen

Dies scheint komplex und fragil zu sein. Wie wäre es einfach mit yn(){ read -s -n 1 -p '[j/n]'; test "$REPLY" = "j" ; } yn && echo Erfolg || echo Fehler

2voto

Mike Q Punkte 5731

Als Antwort auf andere:

Sie müssen den Fall in BASH4 nicht angeben. Verwenden Sie einfach ',,' um eine Variable in Kleinbuchstaben umzuwandeln. Außerdem mag ich es nicht, Code innerhalb des read-Blocks zu platzieren, erhalten Sie das Ergebnis und gehen Sie meiner Meinung nach außerhalb des read-Blocks damit um. Fügen Sie auch ein 'q' zum Beenden hinzu meiner Meinung nach. Schließlich warum 'yes' eingeben, verwenden Sie einfach -n1 und lassen Sie den Benutzer y drücken.

Beispiel: Benutzer kann y/n drücken und auch q zum einfachen Beenden.

ans=''
while true; do
    read -p "Ist MikeQ der Größte oder was (y/n/q)?" -n1 ans
    case ${ans,,} in
        y|n|q) break;;
        *) echo "Antworten Sie mit y für ja / n für nein oder q zum Beenden.";;
    esac
done

echo -e "\nAntwort = $ans"

if [[ "${ans,,}" == "q" ]]; then
        echo "OK, Beenden, wir werden annehmen, dass er es ist"
        exit 0
fi

if [[ "${ans,,}" == "y" ]]; then
        echo "MikeQ ist der Größte!!"
else
        echo "Nein? Ist MikeQ nicht der Größte?"
fi

1voto

ish-west Punkte 81

Ich habe dieses kleine Skript für Ja/Nein-Fragen geschrieben: https://github.com/optimistiCli/getans

Beispiel:

#!/bin/bash

if ! getans.sh 'Sollen wir fortfahren?' y ; then
    echo "Benutzer hat „NEIN“ gesagt"
    exit 1
fi

echo "Benutzer hat „JA“ gesagt"
# etwas Nützliches tun
exit 0

Direkter Link: https://github.com/optimistiCli/getans/raw/main/getans.sh

1voto

Diego Torres Milano Punkte 60646

Ein Python-Alternativvorschlag in einer Zeile unter Verwendung von PyInquirer

python3 -c 'import PyInquirer; print(PyInquirer.prompt([{"type":"confirm", "message":"Möchten Sie fortfahren?", "name":"r"}]).get("r"))'

das ja/nein/abbruch (intr, CTRL+C) unterstützt.

Bildbeschreibung hier eingeben

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