Когда вы делаете это:
check=`echo $?`
Вы заставляете оболочку расширяться $?
, чтобы составить команду echo $?
, а затем назначить ее вывод переменной. Если вы хотите сохранить статус возврата команды, вырежьте среднего человека и просто сделайте следующее:
check=$?
Однако в вашем случае вам не нужно сохранять статус возврата. Оператор if
сам по себе может выполнить проверку &&
.
Итак, если вы хотите найти текстовый файл, содержащий две строки, сделайте следующее:
if grep -qwF "$Author" "BookDB.txt" && grep -qwF "$Title" "BookDB.txt"; then
echo Yes
fi
Параметр -q
предназначен для подавления вывода grep
и -F
- не анализировать шаблон как регулярное выражение.
Однако, что вы, скорее всего, ищете, это строка, содержащая заголовок, за которым следует имя автора, учитывая ваш пример. Итак, вы можете попробовать следующее:
if grep -q "^\\s*$Title\\s*:\\s*$Author\\s*\$" "BookDB.txt"; then
echo yes
fi
Это потребует от пользователя ввести полное название и полное имя автора, а также правильно указать регистр.Так что, может быть, вам нужно что-то более снисходительное:
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo yes
fi
Теперь вас не волнует регистр и вам не нужны полные имена ( John
и john
оба соответствуют ДЖОН Кавендиш
). То же относится к названию.
Следующий MCVE
echo Title:
read Title
echo Author:
read Author
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo Found
fi
работает для следующего файла "BookDB.txt":
Название книги: AuthorName
Название книги: authorname
Название книги: Authorname
книга: authorName
с тестовым примером книга
и автор
.
Что ж, вы все еще не сказали, какой результат вы хотите получить от какого ввода,
так что я пойду чтобы угадать.
Думаю, вы хотите сделать что-то одно (например, вывести «Найдено»)
, если пользователь вводит Title = "Three Little Pigs"
и Author = " Мэри Джейн "
,
или, если пользователь вводит Title =" Cinderella "
и Author =" Paul Johnson "
(или любой другой строка в файле) и что-то еще
(например, вывод «Not Found»), если пользователь вводит что-нибудь еще
(например, Title = "Three
и Автор = "Мэри"
,
или Title = "Три поросенка"
и Автор = "Пол Джонсон"
).
Я предлагаю вам использовать ответ phk и выполнить
if grep "^\s*$Title\s*:\s*$Author\s*$" BookDB.txt > /dev/null
then
echo "Found"
else
echo "Not Found"
fi
, либо вы можете изменить первую строку на
if grep -x "\s*$Title\s*:\s*$Author\s*" BookDB.txt > /dev/null
. Примечания:
^
представляет начало строки . $
обозначает конец строки. ^ образец $
представляет собой образец
, занимающий всю строку. grep -x " шаблон "
также представляют устанавливает шаблон
, занимающий всю строку.
Если вы внимательно прочитаете Соответствие точной строке с помощью grep ,
вы увидите, что перепутали -w
и -x
. \ s
означает пробел.
\ s *
означает ноль или более пробелов.> / dev / null
, чтобы соответствующие строки не отображались на выходе
(т. Е. На экране).
Как указывает giusti ,
вы также можете использовать -q
(или - quiet
или - -silent
) для этого. Как указано в phk , вы можете получить неожиданные / нежелательные результаты
, если название или имя автора включают двоеточие,
или если пользователь вводит любой символ (s)
, которые являются специальными в регулярных выражениях
(например, ^
, $
, \
, *
, [
, ]
, .
,
или иногда (
, )
, {
, }
, ?
и +
).