Apakah ada fungsi / utilitas default untuk meminta pengguna untuk ya / tidak dalam skrip Bash?

14

Terkadang saya perlu meminta iya kepada pengguna / tidak untuk mengkonfirmasi sesuatu.

Biasanya saya menggunakan sesuatu seperti ini:

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

Apakah ada cara yang lebih baik untuk melakukannya? Apakah utilitas ini mungkin sudah ada di /binfolder saya ?

c0rp
sumber
2
Anda dapat mencoba menggunakan select, tetapi sebaliknya saya tidak melihat cara yang lebih sederhana.
muru
2
@uru, saya benar-benar mencuri ide-ide Anda. Saya berharap saya bisa menyerahkan perwakilan saya kepada Anda.
glenn jackman
@glennjackman Saya akan menyebutnya kolaborasi. ;)
muru

Jawaban:

13

Ah, ada sesuatu yang built-in: zenityadalah program dialog grafis:

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

Selain itu zenity, Anda dapat menggunakan salah satu dari:

if dialog --yesno "Is this OK?" 0 0; then ...
if whiptail --yesno "Is this OK?" 0 0; then ...
glenn jackman
sumber
3
Jika program dialog dapat diterima, tidak akan dialogatau whiptaillebih cocok untuk CLI?
muru
2
Memang. Ditambahkan ke jawabannya.
glenn jackman
1
Secara pribadi, saya lebih suka garpu yad,, yang memiliki lebih banyak peningkatan dan lebih sedikit bug IMO.
Sparhawk
11

Itu terlihat baik bagi saya. Saya hanya akan membuatnya sedikit "lakukan atau mati":

  • jika "Y" maka return 0
  • jika "N" maka return 1

Dengan begitu Anda dapat melakukan sesuatu seperti:

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

Dengan selectsaran @ muru , fungsinya bisa sangat singkat:

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
sumber
1

Sebagai kesimpulan saya menulis skrip ini :

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

Versi skrip terbaru dapat ditemukan di sini . Isi gratis untuk mengubah / mengedit

c0rp
sumber
0

Saya menggunakan yang berikut ini:

  • default ke no:
    read -p "??? Are You sure [y/N]? " -n 1
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi
  • default ke yes:
    read -p "??? Are You sure [Y/n]" -n 1
    if [[ $REPLY =~ ^[Nn]$ ]]; then
        echo "!!! Canceled by user."
        exit 1
    fi
Adobe
sumber
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
sumber