Как оценить результат grep в bash?

Я хочу, чтобы grep определенный статус службы (tomcat8.service).

Только если строка была найдена, я хочу выполнить некоторую логику.

Проблема: четная если я выполняю скрипт на имя службы, которого не существует («asd» в этом примере), if $status по-прежнему совпадает и распечатывается. Но почему?

status = $(systemctl status asd.service | grep 'active') echo $status if $status then echo "$SERVICE was active" exit 0 fi exit 0

Результат: asd.service was active, что, конечно же, неверно.

echo $status печатает: status: Unknown job: =

1
задан 24 August 2017 в 16:32

6 ответов

Вы можете использовать статус возврата grep.

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

или даже проще:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

или если вы предпочитаете if:

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.

Обновление:

Нет необходимости в grep. systemctl содержит команду is-active.

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

или:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
2
ответ дан 22 May 2018 в 19:06
  • 1
    Поскольку if использует код возврата, вы можете просто использовать if systemctl status asd.service | grep 'active'; then ... – Florian Diesch 24 August 2017 в 16:44
  • 2
    правда. спасибо за подсказку, обновил ответ. Но нужно $ (...) – RoVo 24 August 2017 в 16:48
  • 3
    Последнее предложение отлично работает! – membersound 24 August 2017 в 16:53
  • 4
    Проблема с выполнением grep 'active' заключается в том, что она найдет inactive, а также active. grep -w active найдет только active и проигнорирует inactive. – Terrance 24 August 2017 в 17:11
  • 5
    как мы можем пропустить systemctl is-active? – RoVo 24 August 2017 в 17:36

Вы можете использовать статус возврата grep.

systemctl status asd.service | grep 'active' \ && status=active \ || status=not_active if [ "$status" == "active" ]; then [...] fi

или даже проще:

test $(systemctl status asd.service | grep 'active') \ && echo "$SERVICE was active"

или если вы предпочитаете if:

if $(systemctl status asd.service | grep 'active'); then echo "$SERVICE was active" fi

В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.

Обновление:

Нет необходимости в grep. systemctl содержит команду is-active.

systemctl -q is-active asd.service \ && echo "$SERVICE was active"

или:

if systemctl -q is-active asd.service; then echo "is active"; fi
2
ответ дан 18 July 2018 в 07:58

Вы можете использовать статус возврата grep.

systemctl status asd.service | grep 'active' \ && status=active \ || status=not_active if [ "$status" == "active" ]; then [...] fi

или даже проще:

test $(systemctl status asd.service | grep 'active') \ && echo "$SERVICE was active"

или если вы предпочитаете if:

if $(systemctl status asd.service | grep 'active'); then echo "$SERVICE was active" fi

В любом случае, обратите внимание на ключевые слова inactive, not active, active (exited) или аналогичные. Это также будет соответствовать вашему заявлению grep. См. Комментарии. Спасибо @ Terrance за подсказку.

Обновление:

Нет необходимости в grep. systemctl содержит команду is-active.

systemctl -q is-active asd.service \ && echo "$SERVICE was active"

или:

if systemctl -q is-active asd.service; then echo "is active"; fi
2
ответ дан 24 July 2018 в 18:57

Некоторые комментарии по обзору кода:

присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация)
if some_comment; then action1; else action2; fi
. Чаще всего команда [ или [[ проверяет какое-либо условие. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите:
if systemctl status asd.service | grep -q 'active'; then
    echo "$SERVICE was active"
fi
0
ответ дан 22 May 2018 в 19:06

Некоторые комментарии по обзору кода:

присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация) if some_comment; then action1; else action2; fi . Чаще всего команда [ или [[ проверяет некоторые условия. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите: if systemctl status asd.service | grep -q 'active'; then echo "$SERVICE was active" fi
0
ответ дан 18 July 2018 в 07:58

Некоторые комментарии по обзору кода:

присвоения переменных sh / bash / ksh / zsh выглядят как var=value - не допускаются пробелы вокруг =. (документация) status=$(some command) - переменная статуса удерживает вывод команды, а не статус выхода. Статус выхода находится в переменной $?, оператор if действует на статус выхода следующей команды (документация) if some_comment; then action1; else action2; fi . Чаще всего команда [ или [[ проверяет какое-либо условие. Однако grep имеет четкий статус выхода: 0, если шаблон найден, 1 в противном случае. Поэтому вы хотите: if systemctl status asd.service | grep -q 'active'; then echo "$SERVICE was active" fi
0
ответ дан 24 July 2018 в 18:57

Другие вопросы по тегам:

Похожие вопросы: