В grep посылается на stdin содержимое $answer. Сам grep проверяет каждую строку в потоке на соответствие регулярному выражению и если соответствует, EXIT_CODE возращает 0, иначе возращает 1. Само регулярное выражение означает, что в строке должен быть один символ из перечисления Y, y, N, n. Чтобы не мусорить на экране дальнейший вывод stdout направляем в /dev/null. Кстати, только вспомнил, вместо этого можно использовать опцю -q в grep. Т.е. ! grep -qe '^[YyNn]$' <<< $answer. Знак ! означает отрицание EXIT_CODE. Т.е, если grep вернул 1, то отрицание отдаст 0. То есть смысл - если введено не Y, y, N, n, то продолжить цикл.