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

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

#!/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
1
задан 24 March 2019 в 11:48

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
1
ответ дан 24 March 2019 в 21:48
  • 1
    После попытки, что Вы предложили, у меня есть раздел без имени └─sdc1 8:33 1 29.7G 0 part. Для добавления этого устройства к /etc/fstab мне было бы нужно эти blkid, но устройство не обнаруживается, когда я делаю blkid. Что я пропускаю?Примечание: Я не эксперт. Я просто выполняю шаги.:) – user128785 28 June 2017 в 17:53

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

Тем не менее Вы имеете 2 варианта, используете grep -c, чтобы считать подобранные строки

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

Или передать подобранные строки по каналу к wc от grep -o (-единственные соответствия)

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 дважды.

0
ответ дан 24 March 2019 в 21:48

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

Похожие вопросы: