A 또는 B, Y 또는 아니요 등의 응답이 필요한 일련의 사용자 항목을 확인해야 합니다. 입력한 값이 허용된 응답 세트와 일치하는지 확인하고 싶습니다. 각각의 요구 사항에 따라 각 유효성 검사를 수행하는 함수를 작성합니다. 기능이 작동하는 것 같지만 응답이 만족스러우면 메인 루프에서 나갈 수 없습니다.
#!/usr/bin/bash
function valcheck()
{
while true;
do
if [[ "$response" =~ [$1] ]]
then
echo "Acceptible response"
return 0
else
echo "Invalid response!"
continue
fi
done
}
#call function
printf "What is the response [A/P]: "
while true; do
read -r response
valcheck "AaPp"
done
답변1
두 개의 루프를 가질 필요는 없습니다 while
. 게다가 나는 while true
루프를 좋아하지 않는다. 사용자 입력 읽기 및 유효성 검사를 단일 함수로 줄일 수 있습니다.
#!/usr/bin/bash
valcheck() {
while
printf '%s' "$2"
read -r response
do
if
[[ "$response" =~ ^[$1]$ ]]
then
echo "Acceptable response!"
break
else
echo "Invalid response!"
fi
done
}
valcheck "AaPp" "What is the response [A/P]: "
답변2
당신이 찾고 있는 명령 단어는 서브루틴이 성공을 반환할 때 루프를 종료하는 것입니다 break
:while true
valcheck "AaPp" && break
참고로 printf
프롬프트 명령을 루프 내로 이동할 수 있습니다. 응답이 "a" 또는 "p"가 아닌 경우 사용자가 원하는 답변을 다시 묻는 것이 좋습니다.