Я хочу к 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: =
Можно использовать статус возврата 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
Некоторый код рассматривает комментарии:
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