Bash 스크립트에서 사용자에게 예 / 아니오를 묻는 기본 기능 / 유틸리티가 있습니까?


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그렇지 않으면 더 간단한 방법이 보이지 않습니다.
muru

2
@muru, 나는 당신의 아이디어를 완전히 훔치고 있습니다. 담당자를 전달할 수 있으면 좋겠습니다.
glenn jackman

@glennjackman 협력이라고 부릅니다. ;)
muru

답변:


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
대화 프로그램을 허용하는 경우가 아닌 것 dialog또는 whiptail더 CLI에 적합 할?
muru

2
과연. 답변에 추가되었습니다.
glenn jackman

1
개인적으로 나는 포크 I를 선호하며 yad개선점은 많고 버그 IMO는 적습니다.
Sparhawk

11

그것은 나에게 잘 보인다. 나는 단지 그것을 "덜하거나 죽게"만들 것이다.

  • "Y"이면 return 0
  • "N"이면 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

@muru의 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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.