Подтвердить что ты не робот

Как использовать сравнение grep файла внутри инструкции bash if/else?

Когда наш сервер появляется, нам нужно проверить файл, чтобы узнать, как настроен сервер.

Мы хотим найти следующую строку внутри нашего файла /etc/aws/hosts.conf:

MYSQL_ROLE=master

Затем мы хотим проверить, существует ли эта строка и использовать оператор if/else для запуска одного из двух вариантов в зависимости от того, существует ли строка или нет.

Что такое синтаксис BASH для оператора if?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi
4b9b3361

Ответ 1

Из grep --help, но также см. man grep:

Состояние выхода равно 0, если выбрана какая-либо строка, 1 в противном случае; если возникла какая-либо ошибка и -q не был указан, статус выхода равен 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Возможно, вы захотите использовать более определенное регулярное выражение, например ^MYSQL_ROLE=master$, чтобы избежать этой строки в комментариях, имена, которые просто начинаются с "master" и т.д.

Это работает, потому что if берет команду и запускает ее и использует возвращаемое значение этой команды, чтобы решить, как действовать, при этом нулевое значение true и ненулевое значение false и— то же, что и другие коды возврата интерпретируются оболочкой и противоположностью языка, такого как C.

Ответ 2

if берет команду и проверяет ее возвращаемое значение. [ - это просто команда.

if grep -q ...
then
  ....
else
  ....
fi

Ответ 3

Обратите внимание, что для PIPE является любой командой или последовательностью команд, а затем:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Для записи [ expr ] представляет собой оболочку с строкой для test expr.

Так как grep возвращается со статусом 0 в случае соответствия и ненулевым статусом в случае отсутствия совпадений, вы можете использовать:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Обратите внимание на использование -l, которое заботится только о файле, имеющем хотя бы одно совпадение (так что grep возвращает, как только найдет одно совпадение, без необходимости продолжать синтаксический анализ входного файла.)

на некоторых платформах [ expr ] не является встроенным, а фактическим исполняемым /bin/[ (последним аргументом которого будет ]), поэтому [ expr ] должен содержать пробелы вокруг квадратные скобки и почему за ним следует один из разделителей списка команд (;, &&, ||, |, &, newline)

Ответ 4

Try:

if [ -n "`grep \"MYSQL_ROLE=master\" /etc/aws/hosts.conf`" ]; then

Ответ 5

просто используйте bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"