O código a seguir fará um loop enquanto CHOICE não for "QUIT" ou um número inteiro menor que NUMBER:
NUMBER=22
while :; do
read CHOICE
case $CHOICE in
QUIT) break;;
*[!0-9]*|'') ;;
*) test "$CHOICE" -lt "$NUMBER" && break;;
esac
done
Se você também quiser que o loop saia quando o usuário inserir ^ D, você deverá colocar o read
como a condição de loop: while read CHOICE; do case $CHOICE ...
.