Você não pode usar o código de retorno de read
(é zero se ele for válido, entrada não vazia) e você não pode usar sua saída ( read
não imprime nada). Mas você pode colocar vários comandos na parte de condição de um loop while. A condição de um loop while pode ser um comando tão complexo quanto você desejar.
while read -n1 -r -p "choose [y]es|[n]o" && [[ $REPLY != q ]]; do
case $REPLY in
y) echo "Yes";;
n) echo "No";;
*) echo "What?";;
esac
done
(Isso encerra o loop se a entrada for q
ou se uma condição de fim de arquivo for detectada).