Как выполнить grep, а затем выполнить оператор if для конкретного вывода из grep? - PullRequest
9 голосов
/ 08 марта 2011

Хорошо, мне нужно найти вывод, который выдает команда, особенно "gbak: ERROR", а затем дать сбой.Я не знаю, правильно ли я поступаю, я попытался сделать, если не получится, если grep выполнил вывод в / dev / null, но я тоже не смог заставить это работать (возможно, просто плохой синтаксис).Я уверен, что это просто, пожалуйста, дайте мне знать.

Заявление if, которое я получил в данный момент:

if [ `sudo -u firebird $GBAK_COMMAND | grep "gbak: ERROR"` == *gbak: ERROR* ]; then
   echo "$DATE Unsucessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi

1 Ответ

11 голосов
/ 08 марта 2011

Вам не нужны квадратные скобки оператора 'test'; просто проверьте состояние выхода grep:

if sudo -u firebird $GBAK_COMMAND | grep -q "gbak: ERROR"
then
   echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi

Опция -q для grep подавляет все выходные данные (варианты POSIX и GNU), поэтому вы просто получаете состояние, которое проверяет if. Если grep находит шаблон, он возвращает успех, что означает, что команда firebird не выполнена. Единственный остаточный вопрос - «записывает ли firebird свою ошибку в стандартный вывод или в стандартную ошибку?» Если вам нужно перенаправить стандартную ошибку, напишите:

if sudo -u firebird $GBAK_COMMAND 2>&1 | grep -q "gbak: ERROR"
then
   echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...