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