Как использовать сравнение 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
Ответы
Ответ 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"