"yes"를 눌러 bash에서 "yes/no" 작업을 수행하는 방법은 무엇입니까?

"yes"를 눌러 bash에서 "yes/no" 작업을 수행하는 방법은 무엇입니까?

Bash 스크립트에 "예/아니요" 구조가 있다고 가정해 보겠습니다.

read -r -p "Yes or no?" response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
 then 
 do ...
else
 exit 0
fi

나는 "아니오"를 누를 때까지 이 구성이 실행되기를 원합니다. 즉, "예"를 누른 다음 "Do..." 작업을 완료한 후 "예 또는 아니요?"로 다시 응답하고 싶습니다.

답변1

원하는 것이 아닐 때까지 계속 응답을 요청해야 합니다.

while true;
do
    read -r -p "Yes or no? " response   
    if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
    then
        echo "You chose yes"
    else
        exit 0
    fi
done

답변2

while 루프를 사용하세요:

while
  read -r -p "Yes or no? " response &&
    [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
do
  ...
done

sh또는 설치할 필요가 없도록 코드를 POSIX와 호환되게 만드세요 bash.

while
   printf 'Yes or No? ' &&
     read answer
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done

printf루프의 종료 조건으로 실패한 종료 상태 (깨진 파이프를 나타낼 수 있음) 및 (eof를 나타낼 수 있음) 도 확인합니다. read이는 일반적으로 원하는 것이기 때문입니다.

bashs 의 경우 프로세스에 내장된 쉘에 의해 read -p프롬프트가 read표시되므로 stdout이 손상된 파이프가 되면 쉘이 종료되지만 printf쉘이 종료되는지 여부는 구현 printf에 따라 다릅니다 . sh구현에는 내장 기능이 있습니다 printf. 일관성을 위해 printf오류를 자체 스크립트 오류로 보고 할 수도 있습니다 .

while
   printf 'Yes or No? ' || exit # with the exit status of printf
   read answer # eof not considered as an error condition
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done

관련 정보