isso parece funcionar (embora possa ser mais arrumado), o erro que você teve foi que ele sempre ficava em loop mesmo se ele inserisse a data no formato correto:
#!/bin/bash
a=0
while [ $a -lt 3 ]
do
echo -n "enter the date :"
read date
[[ $date =~ ([0-9][0-9])/([0-9][0-9])/([0-9]) ]] && break
printf "Invalid date\n";
(( a++ ))
done
[[ $date =~ ([0-9][0-9])/([0-9][0-9])/([0-9]) ]] && { printf "correct date\n"; }