Альтернативная проверка, менее "чистая", но ближе к тому, чего пытался достичь вопрос.
Помните, что [
по своей сути это просто команда. Он всегда принимает определенное количество параметров и выходит из состояния выхода 0 (успех) или 1 (сбой), как и все остальные команды. Например, когда вы сравниваете две строки, синтаксис имеет вид [
, строка 1, ==
, строка 2, ]
.
Прямо сейчас вы используете это как условие if
:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Но это неоднозначно в нескольких отношениях. Как [
узнать, что слева у вас есть команда для запуска, а не фиксированная строка? Как он узнает, что ==
является оператором сравнения строк, а не просто аргументом для grep
? Как он узнает, что |
является частью левого значения, а не разделяет команду на [ prlctl list --info ubuntu-vm
и grep State == "State: running" ]
?
Таким образом, левая сторона также должна быть процитирована. Кроме того, поскольку вы хотите сравнить вывод этой команды, а не сами миры "prctl list --info ...", вам нужен оператор $(…)
:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]