Ответ 1
Да, есть:
if grep --quiet .....
then
# If grep finds something
fi
или если grep терпит неудачу
if ! grep --quiet .....
then
# If grep doesn't find something
fi
В bash я хочу сказать "если файл не содержит XYZ, а затем" сделайте кучу вещей ". Самый естественный способ транспонировать это в код - это что-то вроде:
if [ ! grep --quiet XYZ "$MyFile" ] ; then
... do things ...
fi
Но, конечно, этот недопустимый синтаксис Bash. Я мог бы использовать backticks, но тогда я буду тестировать вывод файла. Вот две альтернативы, которые я могу представить:
grep --quiet XYZ "$MyFile"
if [ $? -ne 0 ]; then
... do things ...
fi
и
grep --quiet XYZ "$MyFile" ||
( ... do things ...
)
Я предпочитаю второй, он больше Lispy и || для потока управления не так уж и необычен в языках сценариев. Я также вижу аргументы для первого, хотя, когда человек читает первую строку, они не знают, почему вы выполняете grep, похоже, что вы выполняете его для основного эффекта, а не просто для управления ветвь в script.
Есть ли третий, более прямой способ, который использует оператор if
и имеет grep
в условии?
Да, есть:
if grep --quiet .....
then
# If grep finds something
fi
или если grep терпит неудачу
if ! grep --quiet .....
then
# If grep doesn't find something
fi
Вам не нужно [
]
(test
), чтобы проверить возвращаемое значение команды. Просто попробуйте:
if ! grep --quiet XYZ "$MyFile" ; then
Это вопрос вкуса, поскольку, очевидно, есть несколько рабочих решений. Когда я сталкиваюсь с такой проблемой, я обычно применяю wc -l
после grep, чтобы подсчитать строки, которые соответствуют. Затем у вас есть одно целое число, которое вы можете оценить в рамках условия теста. Если вопрос только в том, есть ли совпадение вообще (количество совпадающих строк не имеет значения), то применение wc
, вероятно, является OTT, и оценка кода возврата grep
кажется лучшим решением:
Обычно статус выхода равен 0, если выбранные линии найдены и 1 в противном случае. Но статус выхода равен 2, если произошла ошибка, если только -q или --quiet или --silent, и выбранная строка найдена. Обратите внимание, однако, что POSIX отвечает только за такие программы, как grep, cmp и diff, что статус выхода в случае ошибки будет больше, чем 1; поэтому целесообразно, ради мобильности, использовать логика, проверяющая это общее условие вместо строгого равенства с 2.