쉘 프롬프트에서 '예'의 변형을 수용하는 더 좋은 방법


27

필자가 작성한 쉘 스크립트의 유용성 테스트에 따르면 사람들은 '예'라고 대답하는 질문에 대한 대답에 대한 기대치가 서로 다릅니다. 아래 코드 예제의 변형을 참조하십시오.

분명히 내가 생각해 낸 더 좋은 방법이 있어야합니까? 당신의 무엇입니까 읽을 수짧은 폼 이에 걸릴?

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

2
결선 투표. 나는이 질문에 관심이 있지만 프로그래밍 문제 일 가능성이 높으므로 SO에 있어야합니다.
phunehehe

프로그래밍 답변은 Bash
phunehehe

3
@ phunehehe : 쉘 프로그래밍을 받아 들인 이력이있을뿐만 아니라 그것을 수행하는 방법뿐만 아니라 사양이 무엇인지에 대한 질문이기 때문에 SO로 이동하는 것에 동의하지 않습니다.
질 'SO-정지 존재 악마'

4
나는 한 번 그런 스크립트를 썼습니다. 그런 다음 프로그램은 프랑스어와 중국어 간체로 번역되었습니다. 프랑스어 버전을 감추고 프롬프트가 "oui 또는 nonEnter"로 번역 된 것을 보았지만 코드는 여전히 "Y *"또는 "N *"을 원했습니다.
Ben Jackson

답변:


15

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
나는 사용자의 의도가 'ye'와는 분명하다고 말하고 싶습니다.
Aeyoun

48

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도 참조하십시오.


1
좋은. 그러나 나는 바보 인 것 같습니다. locale알고 있는 인수 목록을 어디에서 찾을 수 있습니까 ? Mac OS 10.5 상자의 매뉴얼 페이지에없는 것 같습니다.
dmckee

좋은. 소스로 다시 연결해 주시겠습니까?
Aeyoun

3
@dmckee 당신은 locale -k LC_MESSAGES(그리고 다른 LC_whatever를 위해) 할 수 있거나 표준에 의해 정의 된 것들을 여기 에서 볼 수 있습니다 . @Daniel 내가 링크 한 로케일 유틸리티 페이지 이외의 다른 소스는 무엇입니까?
Random832

1
큰 대답은 분명히 받아 들여야합니다.
jlliagre

6

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그리고 다른 사람들이 그것을 할.

이로 인해 국제화의 모든 문제가 사라집니다. 다른 언어에서는 예상 응답을 번역해야합니다. 표준 쉘 방법은 없습니다. dialog로 설정할 수 있지만 스크립트를 설치해야합니다 (많은 배포판에서 사용 가능하지만 항상 기본적으로 설치되는 것은 아님).

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

3

나는 보통 간단한 함수를 사용한다 :

Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }

이 함수는 반환 0하는 경우 Y또는 y입력하고 1다른 것을 입력하면. 함께 사용할 수 있습니다 if...fi:

if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi

아니면 그냥 이렇게 :

Confirm "Type y" && echo "You typed y"

-s입력 한 내용에 대한 시각적 이력을 갖도록 이륙하십시오 .
Tom Hale

0

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