Gibt es eine Standardfunktion / ein Standarddienstprogramm, um den Benutzer in einem Bash-Skript zur Eingabe von Ja / Nein aufzufordern?

14

Manchmal muss ich den Benutzer nach Ja / Nein fragen, um etwas zu bestätigen.

Normalerweise benutze ich so etwas:

# Yes/no dialog. The first argument is the message that the user will see.
# If the user enters n/N, send exit 1.
check_yes_no(){
    while true; do
        read -p "$1" yn
        if [ "$yn" = "" ]; then
            yn='Y'
        fi
        case "$yn" in
            [Yy] )
                break;;
            [Nn] )
                echo "Aborting..."
                exit 1;;
            * )
                echo "Please answer y or n for yes or no.";;
        esac
    done;
}

Gibt es einen besseren Weg, es zu tun? Befindet sich dieses Dienstprogramm möglicherweise bereits in meinem /binOrdner?

c0rp
quelle
2
Sie können versuchen, eine zu verwenden select, aber ansonsten sehe ich keinen einfacheren Weg.
muru
2
@muru, ich klaue total deine Ideen. Ich wünschte, ich könnte Ihnen meinen Repräsentanten geben.
Glenn Jackman
@glennjackman Ich würde es Zusammenarbeit nennen. ;)
muru

Antworten:

13

Ah, da ist etwas eingebaut: zenityist ein grafisches Dialogprogramm:

if zenity --question --text="Is this OK?" --ok-label=Yes --cancel-label=No
then
    # user clicked "Yes"
else
    # user clicked "No"
fi

Zusätzlich zenitykönnen Sie eine der folgenden Optionen verwenden:

if dialog --yesno "Is this OK?" 0 0; then ...
if whiptail --yesno "Is this OK?" 0 0; then ...
Glenn Jackman
quelle
3
Wenn Dialogprogramme akzeptabel sind, nicht dialogoder whiptailzu CLI besser geeignet?
muru
2
Tatsächlich. Zur Antwort hinzugefügt.
Glenn Jackman
1
Persönlich bevorzuge ich die Gabel, yaddie IMO mehr Verbesserungen und weniger Fehler aufweist.
Sparhawk
11

Das sieht für mich gut aus. Ich würde es einfach ein bisschen weniger "tun oder sterben" machen:

  • wenn "Y" dann return 0
  • wenn "N" dann return 1

Auf diese Weise können Sie Folgendes tun:

if check_yes_no "Do important stuff? [Y/n] "; then
    # do the important stuff
else
    # do something else
fi
# continue with the rest of your script

Mit @ murus selectVorschlag kann die Funktion sehr knapp sein:

check_yes_no () { 
    echo "$1"
    local ans PS3="> "
    select ans in Yes No; do 
        [[ $ans == Yes ]] && return 0
        [[ $ans == No ]] && return 1
    done
}
Glenn Jackman
quelle
1

Als Fazit habe ich dieses Skript geschrieben :

#!/bin/bash

usage() { 
    echo "Show yes/no dialog, returns 0 or 1 depending on user answer"
    echo "Usage: $0 [OPTIONS]
    -x      force to use GUI dialog
    -m <string> message that user will see" 1>&2
    exit 1;
}

while getopts m:xh opts; do
    case ${opts} in
        x) FORCE_GUI=true;
            ;;
        m) MSG=${OPTARG}
            ;;
        h) usage
            ;;
    esac
done

if [ -z "$MSG" ];then
    usage
fi

# Yes/no dialog.
# If the user enters n/N, return 1.
while true; do
    if [ -z $FORCE_GUI ]; then
        read -p "$MSG" yn
        case "$yn" in
            [Yy] )
                exit 0;;
            [Nn] )
                echo "Aborting..." >&1
                exit 1;;
            * )
                echo "Please answer y or n for yes or no.";;
        esac
    else
        if [ -z $DISPLAY ]; then echo "DISPLAY variable is not set" >&1 ; exit 1; fi
        if zenity --question --text="$MSG" --ok-label=Yes --cancel-label=No; then
            exit 0
        else
            echo "Aborting..." >&1
            exit 1
        fi
    fi
done;

Die neueste Version des Skripts finden Sie hier . Füllen Sie frei, um zu ändern / zu bearbeiten

c0rp
quelle
0

Ich benutze die folgenden:

  • Standard auf Nein:
    read -p "??? Are You sure [y/N]? " -n 1
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi
  • Standardeinstellung ist yes:
    read -p "??? Are You sure [Y/n]" -n 1
    if [[ $REPLY =~ ^[Nn]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi
Adobe
quelle
0
 read -p 'Are you sure you want to continue? (y/n) ' -n 1 confirmation
 echo ''                                                                                                   
 if [[ $confirmation != 'y' && $confirmation != 'Y' ]]; then                                               
   exit 3                                                                                                
 fi
 # Code to execute if user wants to continue here.
Thomas Bratt
quelle