На самом деле в этом сценарии есть еще одна ошибка, связанная с внедрением кода (или как вы хотите ее называть): он просто передает вывод grep
команде [
(он же test
) и предполагает, что она вернетправда, если он не пустой.Но если длина вывода больше одного слова, [
будет рассматривать его как выражение и пытаться его оценить.Например, предположим, что файл содержит строку 0 -eq 2
, и вы ищете «0» - [
решит, что 0 не равно 2, и скрипт выдаст значение false, несмотря на то, что он нашел совпадение.
Лучший способ исправить это - использовать предложение Игнасио Васкеса-Абрамса (как пояснил Деннис Уильямсон) - это полностью исключает проблему синтаксического анализа и также быстрее (так как -q
останавливает grep
поиск по первому совпадению).Если бы эта опция была недоступна, другим методом было бы защитить выходные данные двойными кавычками: if [ "$(grep -w -- "$1" "$FILE")" ]; then
(обратите внимание, что я также использовал $ () вместо обратных кавычек, потому что я считаю, что их гораздо легче читать, и кавычки около $ФАЙЛ на тот случай, если в нем есть что-нибудь смешное, например, пробел).