쉘 프롬프트에서 "예" 변형을 허용하는 더 나은 방법

쉘 프롬프트에서 "예" 변형을 허용하는 더 나은 방법

내가 작성한 쉘 스크립트의 유용성 테스트에서는 사람들이 "예"라는 대답을 기대하는 질문에 대답하는 방법에 대해 서로 다른 기대를 갖고 있음을 발견했습니다. 아래 코드 예제의 변형을 참조하세요.

확실히 내가 생각해낸 것보다 더 나은 방법이 있을 것입니까? 너의...는읽을 수 있는그리고더 짧은 형식이것을 받아들이십니까?

read -p 'Answer this question with yes: ' answer
if [ "$answer" = 'Y'
  -o "$answer" = 'YES'
  -o "$answer" = 'Yes'
  -o "$answer" = 'y'
  -o "$answer" = 'yes'
  -o some-alternate-condition ]; then

  echo 'Surely this can be written better?'
fi

답변1

UNIX 표준은 다음을 사용하여 이에 대한 샘플 코드를 제공합니다.locale유용:

if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
    affirmative processing goes here
else
    non-affirmative processing goes here
fi

POSIX로캘(및 실제 시스템의 영어 로캘)에서 "yesexpr" 값은 입니다 "^[yY]". 확장된 정규식으로 해석됩니다. noexpr도 참조하세요.

답변2

a를 사용하는 case것은 다소 동일하지만 유사한 명령문이 YE허용되므로 완벽하지는 않습니다.

read -p 'Answer this question with yes: ' answer
case "${answer}" in
    [yY]|[yY][eE][sS])
        echo 'Surely this can be written better?' ;;
esac

답변3

bash(또는 프롬프트를 독립적으로 표시하는 경우 다른 쉘)를 유지하세요.

case $answer in
  [Yy]*) echo Ok;;
  *) echo "Can't you read? I said to say yes.";;
esac

yn"예",  y(초기 공백 포함) "아니요", "아니오" 와 같은 응답을 허용합니다. wlkjzuhfod이는 최적이 아닐 수 있지만 일반적인 쉘 프롬프트와 일치합니다. 이것이 다른 rm -i모든 사람들 find -ok이 수행하는 작업입니다.

이는 국제화의 전체 문제를 우회합니다. 다른 언어에서는 예상되는 응답을 번역해야 합니다. 그러면 사용할 수 있는 표준 쉘 방법이 없습니다.대화, 그러나 스크립트를 설치해야 합니다(많은 배포판에서 사용할 수 있지만 기본적으로 항상 설치되는 것은 아닙니다).

if dialog --yesno "Choose yes" 0 0; then …

답변4

방금 @faif ans를 수정했습니다.

YesOrNo() {
        while :
        do
                read -p 'Do you want to Continue (yes/no?): ' answer
                case "${answer}" in
                    [yY]|[yY][eE][sS]) exit 0 ;;
                        [nN]|[nN][oO]) exit 1 ;;
                esac
        done
}


if $( YesOrNo ); then
        echo "Ans is yes.. Do something....."
else
        echo "Ans is No... skip.."
fi

시험

root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):  # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....

관련 정보