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

Я хочу к 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: =

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

2 ответа

Можно использовать статус возврата 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
ответ дан 2 December 2019 в 03:37

Некоторый код рассматривает комментарии:

  • присвоения переменной 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
ответ дан 2 December 2019 в 03:37

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

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