Você pode colocar o read e seu case em um while loop e break fora quando a condição for satisfeita:
while : ; do
echo "yes or no?"
read ans
case $ans in
[yY]*)
echo "yes"
break
;;
[nN]*)
echo "no"
break
;;
*)
echo "yes or no only"
;;
esac
done
O while : ; do ... done representa um loop infinito. break sai de um loop for , while ou until . Use break para sair, caso a resposta seja y ou n , caso contrário, o loop continuará.