我需要验证一系列需要 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”时,用户再次询问您想要的答案会更好一些。