Проверьте, существует ли входная строка в файле

Вы должны прочитать string1, что мне делать? Вот мой код:

#!/bin/sh
echo "Enter your sting: "
read read string1
if [ grep -q $string1 file.txt ];then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi
exit 0

2 ответа

Решение
  • Ваш read команда неверна, она должна быть read string1 (и вы должны использовать -r предотвращать read от покалывания: read -r string1);
  • Тест тоже не тот, он должен быть if grep -q $string1 file.txt так как вы не оцениваете вывод grep а скорее его возвращаемое значение;
  • Вы должны пройти -F возможность grep чтобы предотвратить интерпретацию метасимволов регулярных выражений как таковых: if grep -qF $string1 file.txt
  • Вы должны двойные кавычки $string1 для предотвращения возможного расширения имени файла и / или разделения слов: if grep -qF "$string" file.txt

Другие заметки:

  • exit 0 в конце излишне и не очень нужно, как будто сценарию удается достичь этой точки без ошибок, которые он возвращает 0 тем не мение;
  • ShellCheck - очень полезный ресурс для отладки скриптов.

Таким образом, скрипт, исправленный в соответствии с вышеизложенным, будет:

#!/bin/sh
echo "Enter your sting: "
read string1
if grep -qF "$string1" file.txt;then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi

Я думаю, что всегда лучше хранить результат, количество совпадений в этом случае, в переменной.

Тем не менее, у вас есть 2 варианта, используйте grep -c считать совпадающие линии

count=$(grep -c "$string1" file.txt)

Или передайте соответствие линиям wc от grep -o (--only-матчи)

count=$(grep -o "$string1" file.txt | wc -l)

Это будет полный сценарий со вторым вариантом

#!/bin/sh
echo "Enter your string: "
read string1
count=$(grep -o "$string1" file.txt | wc -l)
if [ $count != 0 ];then
   echo "Found it ($count times)"
else
   echo "Sorry this string not in file"
fi
exit 0

Кроме того, вы написали read дважды.

Другие вопросы по тегам