내가 작성한 쉘 스크립트의 유용성 테스트에서는 사람들이 "예"라는 대답을 기대하는 질문에 대답하는 방법에 대해 서로 다른 기대를 갖고 있음을 발견했습니다. 아래 코드 예제의 변형을 참조하세요.
확실히 내가 생각해낸 것보다 더 나은 방법이 있을 것입니까? 너의...는읽을 수 있는그리고더 짧은 형식이것을 받아들이십니까?
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.....