Wie kann ich die Eingabe von Ja / Nein / Abbrechen in einem Linux-Skript anfordern?

Ich möchte die Eingabe in der Skript-Shell anhalten und den Benutzer zur Auswahl auffordern. Die Standardfrage lautet "Ja, Nein oder Abbrechen". Wie mache ich das in einem typischen Bash-Prompt?

1179
22 окт. von Myrddin Emrys am 22. Oktober eingestellt 2008-10-22 20:03 08 um 20:03 Uhr 2008-10-22 20:03
@ 29 Antworten

Die einfachste und am weitesten verbreitete Methode, um Benutzereingaben in der Befehlszeile zu erhalten, ist der read . Der beste Weg, um 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 

Die andere Methode, auf die Stephen Hoovig verweist, ist Bash select . 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 die Eingabe nicht bereinigen - es werden die verfügbaren Optionen angezeigt und Sie geben die Nummer ein, die Ihrer Wahl entspricht. Es wird auch automatisch eine Schleife durchlaufen, so dass keine while true erforderlich ist, um erneut zu versuchen, wenn sie ungültige Eingaben machen.

Lesen Sie auch die ausgezeichnete Antwort F. Hauri.

1342
22 окт. Antwort von Myrddin Emrys am 22. Oktober 2008-10-22 20:08 08 um 20:08 Uhr 2008-10-22 20:08

Mindestens fünf Antworten auf eine häufig gestellte Frage.

Abhängig von

  • : kann auf fehlerhaften Systemen mit gemeinsam genutzten
  • spezifisch: Verwendung von sogenannten Basismen

und wenn du willst

  • einfache '' in line '' Frage / Antwort (allgemeine Lösungen)
  • ziemlich formatierte Schnittstellen wie oder grafischer mit libgtk oder libqt ...
  • Verwenden Sie die leistungsstarke Readline-Lesefunktion

1. Gemeinsame POSIX-Lösungen

Sie können den Befehl read und dann, if... then... else :

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

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

 if [ "$answer" != "${answer#[Yy]}" ] ;then echo Yes else echo No fi 

(Danke an Adam Katz : Ersetzen Sie den obigen Test durch einen tragbareren und vermeidet eine Gabel :)

Posix aber ein Hauptmerkmal

Wenn Sie nicht möchten, dass der Benutzer die Eingabetaste drückt , können Sie Folgendes schreiben:

( Bearbeitet: Wie @JonathanLeffler zu Recht vorschlägt, ist das Speichern der Stty-Konfiguration möglicherweise besser, als sie nur normal zu machen.)

 echo -n "Is this a good question (y/n)? " old_stty_cfg=$(stty -g) stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty if echo "$answer" | grep -iq "^y" ;then echo Yes else echo No fi 

Hinweis Dies wurde in , , , und !

Dasselbe, aber offensichtlich für y oder n zu erwarten:

 #/bin/sh echo -n "Is this a good question (y/n)? " old_stty_cfg=$(stty -g) stty raw -echo answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) stty $old_stty_cfg if echo "$answer" | grep -iq "^y" ;then echo Yes else echo No fi 

Spezialwerkzeug verwenden

Es gibt viele Werkzeuge, die mit libncurses , libgtk , libqt oder anderen grafischen Bibliotheken erstellt wurden. Zum Beispiel mit whiptail :

 if whiptail --yesno "Is this a good question" 20 60 ;then echo Yes else echo No fi 

Je nach System müssen Sie möglicherweise whiptail anderes ähnliches Tool ersetzen:

border=0
 dialog --yesno "Is this a good question" 20 60  echo Yes gdialog --yesno "Is this a good question" 20 60  echo Yes kdialog --yesno "Is this a good question" 20 60  echo Yes 

Dabei steht 20 für die Höhe des Dialogfelds in der Anzahl der Zeilen und 60 für die Breite des Dialogfelds. Alle diese Tools haben dieselbe Syntax.

 DIALOG=whiptail if [ -x /usr/bin/gdialog ] ;then DIALOG=gdialog ; fi if [ -x /usr/bin/xdialog ] ;then DIALOG=xdialog ; fi ... $DIALOG --yesno ... 

2. Spezielle Bash-Lösungen

Hauptmethode

 read -p "Is this a good question (y/n)? " answer case ${answer:0:1} in y|Y ) echo Yes ;; * ) echo No ;; esac 

Ich ziehe es vor, case zu verwenden case damit ich sogar nach yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui wenn nötig ...

gemäß einer Tastenfunktion

Im Bash-Abschnitt können Sie die Länge der beabsichtigten Eingabe für den read angeben:

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

In bash benötigt der read Befehl einen Timeout-Parameter, der nützlich sein kann.

 read -t 3 -n 1 -p "Is this a good question (y/n)? " answer [ -z "$answer" ]  answer="Yes" # if 'yes' have to be default choice 

Einige Tricks für ausgewählte Werkzeuge

Komplexere Dialogfelder, zusätzlich zu einfachen yes - no Zielen:

 dialog --menu "Is this a good question" 20 60 12 y Yes n No m Maybe 

Indikator:

 dialog --gauge "Filling the tank" 20 60 0 < <( for i in {1..100};do printf "XXX\n%d\n%(%a %b %T)T progress: %d\nXXX\n" $i -1 $i sleep .033 done ) 

Kleine Demo:

 #!/bin/sh while true ;do [ -x "$(which ${DIALOG%% *})" ] || DIALOG=dialog DIALOG=$($DIALOG --menu "Which tool for next run?" 20 60 12 2> \ whiptail "dialog boxes from shell scripts" >/dev/tty \ dialog "dialog boxes from shell with ncurses" \ gdialog "dialog boxes from shell with Gtk" \ kdialog "dialog boxes from shell with Kde" ) || exit clear;echo "Choosed: $DIALOG." for i in 'seq 1 100';do date +"'printf "XXX\n%d\n%%a %%b %%T progress: %d\nXXX\n" $i $i'" sleep .0125 done | $DIALOG --gauge "Filling the tank" 20 60 0 $DIALOG --infobox "This is a simple info box\n\nNo action required" 20 60 sleep 3 if $DIALOG --yesno "Do you like this demo?" 20 60 ;then AnsYesNo=Yes; else AnsYesNo=No; fi AnsInput=$($DIALOG --inputbox "A text:" 20 60 "Text here..." 2> >/dev/tty) AnsPass=$($DIALOG --passwordbox "A secret:" 20 60 "First..." 2> >/dev/tty) $DIALOG --textbox /etc/motd 20 60 AnsCkLst=$($DIALOG --checklist "Check some..." 20 60 12 \ Correct "This demo is useful" off \ Fun "This demo is nice" off \ Strong "This demo is complex" on 2> >/dev/tty) AnsRadio=$($DIALOG --radiolist "I will:" 20 60 12 \ " -1" "Downgrade this answer" off \ " 0" "Not do anything" on \ " +1" "Upgrade this anser" off 2> >/dev/tty) out="Your answers:\nLike: $AnsYesNo\nInput: $AnsInput\nSecret: $AnsPass" $DIALOG --msgbox "$out\nAttribs: $AnsCkLst\nNote: $AnsRadio" 20 60 done 

Noch ein Beispiel? Hier erfahren Sie, wie Sie mit whiptail ein USB-Gerät und einen USB-Wechselspeicher auswählen können: USBKeyChooser

5. Leseverlauf verwenden

Beispiel:

 #!/bin/bash set -i HISTFILE=~/.myscript.history history -c history -r myread() { read -e -p '> ' $1 history -s ${!1} } trap 'history -a;exit' 0 1 2 3 6 while myread line;do case ${line%% *} in exit ) break ;; * ) echo "Doing something with '$line'" ;; esac done 

Dadurch wird eine .myscript.history -Datei in Ihrem $HOME Verzeichnis erstellt, und Sie können beispielsweise Verlaufsbefehle wie Aufwärts , Abwärts , Strg + R und andere lesen.

404
10 янв. Die Antwort wird von F. Hauri am 10. Januar gegeben 2015-01-10 13:53 '15 am 13:53 2015-01-10 13:53
 echo "Please enter some input: " read input_variable echo "You entered: $input_variable" 
338
22 окт. Die Antwort ist Pistos 22 Oct. 2008-10-22 20:08 08 um 20:08 Uhr 2008-10-22 20:08

Sie können -in read verwenden . Verwenden Sie die Option -p , um die Benutzer -p Frage zu -p .

Ab BASH4 können Sie jetzt -i , um eine Antwort vorzuschlagen. Der Benutzer muss nur die Eingabetaste drücken, um die Antwort einzugeben:

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

(Vergessen Sie jedoch nicht, die Option "readline" -e zu verwenden, um Zeilen mit Pfeilen bearbeiten zu können.)

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 ~/ 
139
13 мая '11 в 7:44 2011-05-13 07:44 Die Antwort ist yPhil 13. Mai '11 um 07:44 Uhr 2011-05-13 07:44 gegeben

Bash select für diesen Zweck.

 select result in Yes No Cancel do echo $result done 
98
22 окт. Antwort von Steven Huwig am 22. Oktober 2008-10-22 21:14 08 um 21:14 Uhr 2008-10-22 21: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 
53
03 февр. die antwort ist serg 03 feb . 2011-02-03 16:23 '11 am 16:23 2011-02-03 16:23

Folgendes habe ich gesammelt:

 #!/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 Neuling, also nimm es mit Salz, aber es sieht so aus, als würde es funktionieren.

31
30 авг. die antwort wird mpen 30 aug gegeben. 2012-08-30 20:59 '12 um 20:59 Uhr 2012-08-30 20:59
 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?" ... 
27
22 окт. Antwort von SumoRunner 22. Oktober 2008-10-22 20:08 08 um 20:08 Uhr 2008-10-22 20:08

Wollen Sie:

  • Integrierte Bash-Befehle (z. B. tragbar)
  • TTY überprüfen
  • Standardantwort
  • Zeitüberschreitung
  • Farbe Frage

Auszug

 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... => Ruft den read bei TTY auf
  • read -n 1 => Warte ein Zeichen
  • $'\e[1;32m... \e[0m ' => Grün $'\e[1;32m... \e[0m '
    (grün ist gut, weil es sowohl auf weiß als auch auf schwarz liest)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => Bash Regex

Timeout => Standardantwort - 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 
24
18 дек. Die Antwort wird 18 Dez. gegeben. 2015-12-18 14:36 '15 um 14:36 Uhr 2015-12-18 14:36

Der einfachste Weg, dies mit den wenigsten Zeilen zu erreichen:

 read -p "<Your Friendly Message here> : y/n/cancel" CONDITION; if [ "$CONDITION" == "y" ]; then # do something here! fi 

if ist nur ein Beispiel: Sie entscheiden, wie Sie mit dieser Variablen umgehen.

21
04 марта '16 в 0:22 2016-03-04 00:22 Die Antwort gibt Apurv Nerlekar am 04. März 2016 um 0:22 Uhr 2016-03-04 00:22

Verwenden Sie den read :

09 мая '12 в 3:00 2012-05-09 03:00 Die Antwort wird ThatLinuxGuy 09. Mai '12 um 3:00 2012-05-09 03:00 gegeben

Diese Lösung liest ein Zeichen und ruft die Antwortfunktion yes auf.

 read -p "Are you sure? (y/n) " -n 1 echo if [[ $REPLY =~ ^[Yy]$ ]]; then do_something fi 
16
15 нояб. Die Antwort wird gegeben Dennis 15 Nov. 2013-11-15 10:04 '13 am 10:04 2013-11-15 10:04
 read -e -p "Enter your choice: " choice 

Mit der Option -e kann der Benutzer den Eintrag mit den Pfeiltasten bearbeiten.

Wenn Sie den Satz als Eingabe verwenden möchten:

 read -e -i "yes" -p "Enter your choice: " choice 

-i druckt eine suggestive Eingabe.

12
19 апр. Die Antwort ist Jahid 19. April gegeben 2015-04-19 03:37 '15 am 3:37 2015-04-19 03:37

Es tut mir leid für diesen Beitrag. Vor einigen Wochen hatte ich ein ähnliches Problem. In meinem Fall brauchte ich eine Lösung, die auch in einem Online-Installationsskript funktionierte, zum Beispiel: curl -Ss https://raw.github.com/_____/installer.sh | bash curl -Ss https://raw.github.com/_____/installer.sh | bash

read yesno < /dev/tty für mich großartig:

 echo -n "These files will be uploaded. Is this ok? (y/n) " read yesno < /dev/tty if [ "x$yesno" = "xy" ];then # Yes else # No fi 

Hoffe das hilft jemandem.

9
21 мая '14 в 14:22 2014-05-21 14:22 Die Antwort ist gegeben xyz 21. Mai 14 um 14:22 2014-05-21 14:22

Um ein schönes Eingabefenster mit ncurses zu erhalten, verwenden Sie den Befehl dialog wie folgt:

 #!/bin/bash if (dialog --title "Message" --yesno "Want to do something risky?" 6 25) # message box will have the size 25x6 characters then echo "Let do something risky" # do something risky else echo "Let stay boring" fi 

Das Dialogpaket wird standardmäßig mindestens bei SUSE Linux installiert.

7
06 апр. Antwort von Thorsten Staerk 06 Apr. 2014-04-06 14:40 '14 um 14:40 2014-04-06 14:40

Nur ein Tastendruck

Hier ist ein längerer, aber wiederverwendbarer und modularer Ansatz:

  • Gibt 0 = Ja und 1 = Nein zurück
  • Sie müssen nicht das erforderliche Passwort eingeben - nur ein Zeichen
  • Sie können die Eingabetaste drücken, um die Standardauswahl zu akzeptieren.
  • Kann die Standardauswahl für die erzwungene Auswahl deaktivieren.
  • Funktioniert sowohl für zsh als auch für bash .

Der Standardwert ist no, wenn Sie die Eingabetaste drücken

Beachten Sie, dass N Kapital ist. Hier wird der Standardwert eingegeben:

 $ confirm "Show dangerous command"  echo "rm *" Show dangerous command [y/N]? X Show dangerous command [y/N]? y rm * 

Standardmäßig Ja, wenn Sie die Eingabetaste drücken

Beachten Sie, dass Y großgeschrieben wird:

 $ get_yes_keypress "Here you cannot press enter. Do you like this [y/n]? " Here you cannot press enter. Do you like this [y/n]? k Here you cannot press enter. Do you like this [y/n]? Here you cannot press enter. Do you like this [y/n]? n $ echo $? 1 

Hier wurde 1 zurückgegeben oder falsch. Bitte beachten Sie, dass Sie bei dieser untergeordneten Funktion Ihre eigenen [y/n]? sofort

Code

5
28 июня '18 в 11:39 2018-06-28 11:39 Die Antwort wird von Tom Hale am 28. Juni 18 um 11:39 2018-06-28 11:39 gegeben

Inspiriert von den Antworten von @Mark und @Myrddin habe ich diese Funktion für die 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 is not a correct value\n" done } 

benutze es wie folgt:

 unipromtp "Select an option: (a)-Do one (x)->Do two (f)->Do three : " "axf" selection echo "$selection" 
4
08 янв. Antwort gegeben Poxtron Jan 08 2015-01-08 03:40 '15 am 3:40 2015-01-08 03:40

Option mit mehreren Optionen:

 ask () { # $1=question $2=options # set REPLY # options: 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 'continue?' 'y=yes|n=no|m=maybe' continue? [y=yes|n=no|m=maybe] g continue? [y=yes|n=no|m=maybe] k continue? [y=yes|n=no|m=maybe] y $ 

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

4
28 дек. Die Antwort wird von Ernest A 28 Dezember gegeben. 2013-12-28 20:50 13 um 20:50 Uhr 2013-12-28 20:50

Ich schlage vor, Sie verwenden den Dialog ...

Linux-Auszubildender: Verbessern von Bash-Shell-Skripts mithilfe des Dialogfelds

Mit dem Befehl dialog können Sie Fenster in Shellskripts verwenden, um deren Verwendung interaktiver zu gestalten.

Es ist einfach und benutzerfreundlich, es gibt auch eine Version von gnome, genannt gdialog, die exakt dieselben Parameter verwendet, aber ihren GUI-Stil auf X zeigt.

3
22 окт. Antwort von Osama Al-Maadeed am 22. Oktober 2008-10-22 20:14 08 um 20:14 Uhr 2008-10-22 20:14

Mir ist aufgefallen, dass niemand eine Antwort mit einem mehrzeiligen Echo-Menü für eine solche einfache Benutzereingabe gesendet hat.

 #!/bin/bash function ask_user() { echo -e " #~~~~~~~~~~~~# | 1.) Yes | | 2.) No | | 3.) Quit | #~~~~~~~~~~~~#\n" read -e -p "Select 1: " choice if [ "$choice" == "1" ]; then do_something elif [ "$choice" == "2" ]; then do_something_else elif [ "$choice" == "3" ]; then clear  exit 0 else echo "Please select 1, 2, or 3."  sleep 3 clear  ask_user fi } ask_user 

Diese Methode wurde in der Hoffnung gesendet, dass jemand sie für nützlich hält und Zeit spart.

3
08 дек. Antwort gegeben Yokai 08 Dez. 2016-12-08 10:42 '16 um 10:42 am 2016-12-08 10:42

allgemeiner wäre:

 function menu(){ title="Question time" prompt="Select:" options=("Yes" "No" "Maybe") echo "$title" PS3="$prompt" select opt in "${options[@]}" "Quit/Cancel"; do case "$REPLY" in 1 ) echo "You picked $opt which is option $REPLY";; 2 ) echo "You picked $opt which is option $REPLY";; 3 ) echo "You picked $opt which is option $REPLY";; $(( ${#options[@]}+1 )) ) clear; echo "Goodbye!"; exit;; *) echo "Invalid option. Try another one.";continue;; esac done return } 
3
29 июля '15 в 14:39 2015-07-29 14:39 Die Antwort wurde von Alexander Löfqvist am 29. Juli 15 um 14:39 2015-07-29 14:39 gegeben

Eine einfache Möglichkeit, dies zu tun, ist xargs -p oder parallel --interactive .

Ich mag das Verhalten von xargs etwas besser, da es jeden Befehl direkt nach der Einladung ausführt, wie andere interaktive Unix-Befehle, anstatt Yesses zu sammeln, die am Ende ausgeführt werden sollen. (Sie können Strg-C drücken, nachdem Sie die benötigten durchlaufen haben.)

zum beispiel

 echo *.xml | xargs -p -n 1 -J {} mv {} backup/ 
3
08 апр. Antwort von Joshua Goldberg am 8. April 2015-04-08 22:30 '15 um 22:30 Uhr 2015-04-08 22:30 Uhr

In case solchen Szenario habe ich die case einige Male verwendet. Die Verwendung des case-Arguments ist eine gute Möglichkeit, dies zu tun. Eine while , die einen Fallblock implementiert, der eine logische Bedingung verwendet, kann implementiert werden, um das Programm weiter zu steuern und viele andere Anforderungen zu erfüllen. Nachdem alle Bedingungen erfüllt sind, können Sie break , wodurch die Kontrolle wieder in den Hauptteil des Programms übertragen wird. Um andere Bedingungen zu erfüllen, können natürlich bedingte Anweisungen hinzugefügt werden, um die Kontrollstrukturen zu begleiten: die case und eine mögliche while .

Ein Beispiel für die Verwendung einer case zur Erfüllung Ihrer Abfrage.

 #! /bin/sh # For potential users of BSD, or other systems who do not # have a bash binary located in /bin the script will be directed to # a bourne-shell, eg /bin/sh # NOTE: It would seem best for handling user entry errors or # exceptions, to put the decision required by the input # of the prompt in a case statement (case control structure), echo Would you like us to perform the option: "(Y|N)" read inPut case $inPut in # echoing a command encapsulated by # backticks (``) executes the command "Y") echo `Do something crazy` ;; # depending on the scenario, execute the other option # or leave as default "N") echo `execute another option` ;; esac exit 
2
08 нояб. Die Antwort wird oOpSgEo 08 Nov. gegeben. 2016-11-08 12:38 '16 am 12:38 2016-11-08 12:38
 yn() { if [[ 'y' == `read -s -n 1 -p "[y/n]: " Y; echo $Y` ]]; then eval $1; else eval $2; fi } yn 'echo yes' 'echo no' yn 'echo absent no function works too!' 
2
23 сент. Die Antwort wird Jlettvin 23 Sep gegeben . 2013-09-23 23:59 '13 um 23:59 Uhr 2013-09-23 23:59

Als Freund einer Linie habe ich Folgendes verwendet:

 while [ -z $prompt ]; do read -p "Continue (y/n)?" choice;case "$choice" in y|Y ) prompt=true; break;; n|N ) exit 0;; esac; done; prompt=; 

Die geschriebene >

 while [ -z $prompt ]; do read -p "Continue (y/n)?" choice; case "$choice" in y|Y ) prompt=true; break;; n|N ) exit 0;; esac; done; prompt=; 
2
04 июня '15 в 22:03 2015-06-04 22:03 Die Antwort wird am 4. Juni 15 um 10:03 Uhr gegeben ccDict. 2015-06-04 22:03

Sie können REPLY standardmäßig zum read , in Kleinbuchstaben konvertieren und mit einer Menge von Variablen mit einem Ausdruck vergleichen.
Das Skript unterstützt auch ja / si / qui

 read -rp "Do you want a demo? [y/n/c] " [[ ${REPLY,,} =~ ^(c|cancel)$ ]]  { echo "Selected Cancel"; exit 1; } if [[ ${REPLY,,} =~ ^(y|yes|j|ja|s|si|o|oui)$ ]]; then echo "Positive" fi 
0
12 дек. Die Antwort gibt Walter A am 12. Dezember. 2018-12-12 18:50 '18 am 18:50 2018-12-12 18:50

Als Antwort auf andere:

Sie müssen in BASH4 keinen Fall angeben. Verwenden Sie einfach ",", um var in Kleinbuchstaben zu machen. Ich mag es auch nicht, den Code in den Leseblock einzufügen, das Ergebnis zu erhalten und außerhalb des IMO-Leseblocks zu verarbeiten. Geben Sie auch "q" ein, um IMO zu beenden. Und schließlich, warum "Ja" einfach -n1 verwenden und y drücken.

Beispiel: Ein Benutzer kann die Tasten y / n und auch q drücken, um den Vorgang zu beenden.

 ans='' while true; do read -p "So is MikeQ the greatest or what (y/n/q) ?" -n1 ans case ${ans,,} in y|n|q) break;; *) echo "Answer y for yes / n for no or q for quit.";; esac done echo -e "\nAnswer = $ans" if [[ "${ans,,}" == "q" ]] ; then echo "OK Quitting, we will assume that he is" exit 0 fi if [[ "${ans,,}" == "y" ]] ; then echo "MikeQ is the greatest!!" else echo "No? MikeQ is not the greatest?" fi 
0
20 мая '18 в 6:09 2018-05-20 06:09 Die Antwort wird von Mike Q am 20. Mai '18 um 6:09 ; 2018-05-20 06:09 gegeben

Ja / Nein / Abbrechen

Funktion

 #!/usr/bin/env bash @confirm() { local message="$*" local result='' echo -n "> $message (Yes/No/Cancel) " > while [ -z "$result" ] ; do read -s -n 1 choice case "$choice" in y|Y ) result='Y' ;; n|N ) result='N' ;; c|C ) result='C' ;; esac done echo $result } 

Verwendung von

 case $(@confirm 'Confirm?') in Y ) echo "Yes" ;; N ) echo "No" ;; C ) echo "Cancel" ;; esac 

Überprüfen Sie mit sauberen Benutzereingaben

Funktion

 #!/usr/bin/env bash @confirm() { local message="$*" local result=3 echo -n "> $message (y/n) " > while [[ $result -gt 1 ]] ; do read -s -n 1 choice case "$choice" in y|Y ) result=0 ;; n|N ) result=1 ;; esac done return $result } 

Verwendung von

 if @confirm 'Confirm?' ; then echo "Yes" else echo "No" fi 
0
14 июля '17 в 23:13 2017-07-14 23:13 Die Antwort wurde von Eduardo Cuomo am 14. Juli 17 um 23:13 2017-07-14 23:13 gegeben

Mit PHP ist dies für Shellskripte nützlich:

 #!/usr/bin/php <?php $yo = readline("Do you wish to install this program? [Y/y] or [ctrl+c to quit]"); if ($yo == "Y" || $yo == "y") { echo "Installing.."; system("sudo apt install ..."); } 

Dies erfordert das php-cli-Paket.

-6
09 авг. Die Antwort wird von Cryptopat 09 Aug. gegeben. 2017-08-09 00:36 '17 am 0:36 2017-08-09 00:36

Weitere Fragen zu Tags oder Ask a Question