Bash условный код выхода команды

В 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 в условии?

Ответ 1

Да, есть:

if grep --quiet .....
then
    # If grep finds something
fi

или если grep терпит неудачу

if ! grep --quiet .....
then
    # If grep doesn't find something
fi

Ответ 2

Вам не нужно [ ] (test), чтобы проверить возвращаемое значение команды. Просто попробуйте:

if ! grep --quiet XYZ "$MyFile" ; then

Ответ 3

Это вопрос вкуса, поскольку, очевидно, есть несколько рабочих решений. Когда я сталкиваюсь с такой проблемой, я обычно применяю wc -l после grep, чтобы подсчитать строки, которые соответствуют. Затем у вас есть одно целое число, которое вы можете оценить в рамках условия теста. Если вопрос только в том, есть ли совпадение вообще (количество совпадающих строк не имеет значения), то применение wc, вероятно, является OTT, и оценка кода возврата grep кажется лучшим решением:

Обычно статус выхода равен 0, если выбранные линии найдены и 1 в противном случае. Но статус выхода равен 2, если произошла ошибка, если только -q или --quiet или --silent, и выбранная строка найдена. Обратите внимание, однако, что POSIX отвечает только за такие программы, как grep, cmp и diff, что статус выхода в случае ошибки будет больше, чем 1; поэтому целесообразно, ради мобильности, использовать логика, проверяющая это общее условие вместо строгого равенства с 2.