6

Я не могу понять, как заставить этот (что должно быть просто) скрипт работать. В основном то, что я хочу - запускать разные вещи в зависимости от состояния моего Parallels vm, что-то вроде этого:

if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then 
   echo 'machine is running'
else
   echo 'machine is not running'
fi

Конечно, это не работает

2 ответа2

12

Проблема в том, что вы помещаете все это в [ , то есть в test команду. Более того, ваше использование grep работает.

Все, что тебе нужно:

if prlctl list --info ubuntu-vm | grep -q "State: running"; then
   echo 'machine is running'
else
   echo 'machine is not running'
fi

Обратите внимание на использование -q в качестве аргумента для grep . Он ничего не записывает в STDOUT и выходит со статусом 0, если совпадение найдено, и ненулевым в противном случае.

2

Альтернативная проверка, менее "чистая", но ближе к тому, чего пытался достичь вопрос.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .