Похоже, что $LINE
содержит значение, начинающееся с тире.
Вы можете защититься от этого с помощью
grep -q -e "$LINE"
В общем случае, большинство команд Unix позволяют --
отмечать конец опций, и поэтому любой аргумент после этой опции "конец опций" будет восприниматься как буквальный аргумент без опций.
echo
тоже будет иметь проблему; переносимое решение - перейти на printf
, который отлично работает с аргументами, начинающимися с тире, если только это не первый аргумент, который является строкой формата.
Вы также должны избегать использования имен переменных в верхнем регистре; они зарезервированы для системного использования.
Наконец, сценариям почти никогда не нужно явно проверять $?
- это уже сделано if
, while
и другими управляющими конструкциями.
if grep -q -e "$line" log.log; then
printf '%s\n' "$line"
fi
В качестве оптимизации, если поместить перенаправление за пределы цикла, то все будет происходить намного быстрее.
while read -r line; do
grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt