क्या बैश स्क्रिप्ट में हां / नहीं के लिए उपयोगकर्ता को संकेत देने के लिए कोई डिफ़ॉल्ट फ़ंक्शन / उपयोगिता है?


14

कभी-कभी मुझे कुछ पुष्टि करने के लिए उपयोगकर्ता को हां / नहीं में पूछने की आवश्यकता होती है।

आमतौर पर मैं कुछ इस तरह का उपयोग करता हूं:

# 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;
}

इसे करने का कोई बेहतर तरीका है? क्या यह उपयोगिता शायद मेरे /binफ़ोल्डर में पहले से है ?


2
आप एक का उपयोग करने की कोशिश कर सकते हैं select, लेकिन अन्यथा मुझे एक सरल तरीका नहीं दिखता है।
मुरु

2
@ मरमू, मैं आपके विचारों को पूरी तरह से चुरा रहा हूं। काश मैं अपने प्रतिनिधि को आपके हाथों सौंप सकता।
बजे ग्लेन जैकमैन

@glennjackman मैं इसे सहयोग कहूंगा। ;)
मूरू

जवाबों:


13

आह, इसमें कुछ अंतर्निहित है: zenityएक चित्रमय संवाद कार्यक्रम है:

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

इसके अतिरिक्त zenity, आप इनमें से एक का उपयोग कर सकते हैं:

if dialog --yesno "Is this OK?" 0 0; then ...
if whiptail --yesno "Is this OK?" 0 0; then ...

3
यदि संवाद कार्यक्रम स्वीकार्य हैं, तो क्या CLI के अनुकूल नहीं होगा dialogया whiptailअधिक अनुकूल होगा?
मूरू

2
वास्तव में। जवाब में जोड़ा गया।
बजे ग्लेन जैकमैन

1
व्यक्तिगत रूप से, मैं कांटा पसंद करता हूं yad, जिसमें अधिक सुधार और कम बग आईएमओ हैं।
स्पार्कहॉक

11

जो मुझे ठीक लगता है। मैं इसे थोड़ा कम करूंगा "करो या मरो":

  • अगर "Y" है तो return 0
  • अगर "एन" तो return 1

इस तरह से आप कुछ कर सकते हैं:

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

@ मुरु के selectसुझाव के साथ, समारोह बहुत अधिक हो सकता है:

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

1

निष्कर्ष के रूप में मैंने यह स्क्रिप्ट लिखी है :

#!/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;

स्क्रिप्ट का नवीनतम संस्करण यहां पाया जा सकता है । बदलने / संपादित करने के लिए स्वतंत्र भरें


0

मैं निम्नलिखित का उपयोग कर रहा हूं:

  • डिफ़ॉल्ट नहीं:
    read -p "??? Are You sure [y/N]? " -n 1
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi
  • डिफ़ॉल्ट के लिए हाँ:
    read -p "??? Are You sure [Y/n]" -n 1
    if [[ $REPLY =~ ^[Nn]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi

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.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.