Parece que $LINE contém um valor que começa com um traço.
Você pode proteger contra isso com
grep -q -e "$LINE"
Mais geralmente, a maioria dos comandos Unix permite que -- marque o fim das opções, e assim qualquer argumento após essa opção "fim de opções" será considerado como um argumento literal, sem opção.
echo terá um problema também; a solução portátil é mudar para printf , que funciona bem com argumentos que começam com traços, desde que não seja o primeiro argumento, que é uma string de formato.
Você também deve evitar usar nomes de variáveis maiúsculas; estes são reservados para uso do sistema.
Por fim, os scripts quase nunca precisam examinar explicitamente $? - isso já é feito por if , while e outras construções de controle.
if grep -q -e "$line" log.log; then
printf '%s\n' "$line"
fi
Como uma otimização, colocar o redirecionamento fora do loop tornará as coisas muito mais rápidas.
while read -r line; do
grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt