Primeiro, o erro de [ é porque answer está vazio, portanto, [ vê três argumentos: = , y e ] . Sempre coloque aspas duplas em torno das substituições de variáveis: if [ "$answer" = "y" ] .
O motivo $answer está vazio fd 0 está ocupado com a entrada do arquivo devido ao redirecionamento <tester durante o loop while.
while IFS= read -r line <&3
do
read -n 1 -p "Print line? [y/n] " answer
if test "$answer" = "y"
then
echo "$line"
fi
done 3< tester