Зачем проверять при вводе, если Вы всё равно проверяете потом?while ${flag:-true}
do
flag=false
read -n 4 test
case test in
xxxx) echo "Выбран вариант xxxx";;
xxxy) echo "Выбран вариант xxxy";;
xxyy) echo "Выбран вариант xxyy";;
xyyy) echo "Выбран вариант xyyy";;
*) echo "Wrong input"
flag=true
esac
done
И вообще, для выбора из нескольких значений откройте для себя select(read и case в одном флаконе)