Альтернативная проверка, менее "чистая", но ближе к тому, чего пытался достичь вопрос.
Помните, что [ по своей сути это просто команда. Он всегда принимает определенное количество параметров и выходит из состояния выхода 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" ]