Frage Wie fordere ich zur Eingabe von Ja / Nein / Abbrechen in einem Linux-Shell-Skript auf?


Ich möchte die Eingabe in einem Shell-Skript anhalten und den Benutzer zur Auswahl auffordern. Die Standardfrage "Ja, Nein oder Abbrechen". Wie erreiche ich dies in einer typischen Bash-Eingabeaufforderung?


1100
2017-10-22 17:03


Ursprung


Antworten:


Die einfachste und am weitesten verbreitete Methode, Benutzereingaben an einer Shell-Eingabeaufforderung zu erhalten, ist die read Befehl. Der beste Weg, seine Verwendung zu veranschaulichen, ist eine einfache Demonstration:

while true; do
    read -p "Do you wish to install this program?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

Eine andere Methode, auf die Steven Huwig hingewiesen hat, ist Bashs select Befehl. Hier ist das gleiche Beispiel mit select:

echo "Do you wish to install this program?"
select yn in "Yes" "No"; do
    case $yn in
        Yes ) make install; break;;
        No ) exit;;
    esac
done

Mit select Sie müssen die Eingabe nicht bereinigen - sie zeigt die verfügbaren Optionen an und Sie geben eine Nummer ein, die Ihrer Auswahl entspricht. Es wird auch automatisch wiederholt, sodass keine Notwendigkeit besteht while true Wiederholen Sie die Schleife, wenn sie eine ungültige Eingabe geben.

Schauen Sie sich auch die ausgezeichnete Antwort von F. Hauri.


1269
2017-10-22 17:08



Mindestens fünf Antworten für eine generische Frage.

Es hängt davon ab

  •  konform: könnte auf schlechten Systemen mit generischen funktionieren  Umgebungen
  •  spezifisch: mit so genannten Bashismen

und wenn du willst

  • einfache "in line" Frage / Antwort (generische Lösungen)
  • schön formatierte Schnittstellen, wie  oder mehr graphisch mit libgtk oder libqt ...
  • Verwenden Sie leistungsstarke Readline History-Funktionen

1. POSIX generische Lösungen

Du könntest das benutzen read Befehl, gefolgt von if ... then ... else:

echo -n "Is this a good question (y/n)? "
read answer

# if echo "$answer" | grep -iq "^y" ;then


374
2018-01-10 10:53



echo "Please enter some input: "
read input_variable
echo "You entered: $input_variable"

333
2017-10-22 17:08



Sie können das eingebaute verwenden lesen Befehl ; Benutze die -p Option, um den Benutzer mit einer Frage zu fragen.

Seit BASH4 können Sie jetzt verwenden -i um eine Antwort vorzuschlagen, also muss der Benutzer nur drücken return um es zu betreten:

read -e -p "Enter the path to the file: " -i "/usr/local/etc/" FILEPATH
echo $FILEPATH

(Aber denken Sie daran, die Option "readline" zu verwenden -e um die Zeilenbearbeitung mit den Pfeiltasten zu ermöglichen

Wenn Sie eine "Ja / Nein" -Logik wünschen, können Sie Folgendes tun:

read -e -p "
List the content of your home dir ? [Y/n] " YN

[[ $YN == "y" || $YN == "Y" || $YN == "" ]] && ls -la ~/

117
2018-05-13 04:44



Bash hat wählen für diesen Zweck.

select result in Yes No Cancel
do
    echo $result
done

95
2017-10-22 18:14



read -p "Are you alright? (y/n) " RESP
if [ "$RESP" = "y" ]; then
  echo "Glad to hear it"
else
  echo "You need more bash programming"
fi

51
2018-02-03 13:23



Hier ist etwas, was ich zusammengestellt habe:

#!/bin/sh

promptyn () {
    while true; do
        read -p "$1 " yn
        case $yn in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Please answer yes or no.";;
        esac
    done
}

if promptyn "is the sky blue?"; then
    echo "yes"
else
    echo "no"
fi

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


27
2017-08-30 17:59



Sie wollen:

  • Bash eingebaute Befehle (d. H. Tragbar)
  • Überprüfen Sie TTY
  • Standardantwort
  • Auszeit
  • Farbige Frage

Ausschnitt

do_xxxx=y                      # In batch mode => Default is Yes
[[ -t 0 ]] &&                  # If TTY => Prompt the question
read -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx  # Store the answer in $do_xxxx
if [[ $do_xxxx =~ ^(y|Y|)$ ]]  # Do if 'y' or 'Y' or empty
then
    xxxx
fi

Erklärungen

  • [[ -t 0 ]] && read ... => Befehl aufrufen read wenn TTY
  • read -n 1 => Warte auf ein Zeichen
  • $'\e[1;32m ... \e[0m ' => Grün drucken
    (Grün ist in Ordnung, weil lesbar auf weiß / schwarzen Hintergründen)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => Bash Regex

Timeout => Standardantwort ist Nein

do_xxxx=y
[[ -t 0 ]] && {                   # Timeout 5 seconds (read -t 5)
read -t 5 -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx ||  # read 'fails' on timeout
do_xxxx=n ; }                     # Timeout => answer No
if [[ $do_xxxx =~ ^(y|Y|)$ ]]
then
    xxxx
fi

22
2017-12-18 11:36



inquire ()  {
  echo  -n "$1 [y/n]? "
  read answer
  finish="-1"
  while [ "$finish" = '-1' ]
  do
    finish="1"
    if [ "$answer" = '' ];
    then
      answer=""
    else
      case $answer in
        y | Y | yes | YES ) answer="y";;
        n | N | no | NO ) answer="n";;
        *) finish="-1";
           echo -n 'Invalid response -- please reenter:';
           read answer;;
       esac
    fi
  done
}

... other stuff

inquire "Install now?"

...

21
2017-10-22 17:08



Der einfachste Weg, dies mit der geringsten Zeilenanzahl zu erreichen, ist wie folgt:

read -p "<Your Friendly Message here> : y/n/cancel" CONDITION;

if [ "$CONDITION" == "y" ]; then
   # do something here!
fi

Das if ist nur ein Beispiel: Es liegt an Ihnen, wie Sie mit dieser Variablen umgehen.


19
2018-03-03 21:22



Diese Lösung liest ein einzelnes Zeichen und ruft eine Funktion auf eine Ja-Antwort auf.

read -p "Are you sure? (y/n) " -n 1
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    do_something      
fi

15
2017-11-15 07:04