Проверьте, существует ли входная строка в файле
Вы должны прочитать 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
дважды.