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
이는 일반적으로 원하는 것이기 때문입니다.
bash
s 의 경우 프로세스에 내장된 쉘에 의해 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