El problema es que lo estás poniendo todo dentro de [ , es decir, el test dominio. Además, su uso de grep está roto.
Todo lo que necesitas es:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Tenga en cuenta el uso de -q como argumento para grep . No escribe nada en STDOUT y sale con un estado de 0 si se encuentra la coincidencia y distinto de cero en caso contrario.
Una verificación alternativa, menos "limpia" pero más cercana a lo que la pregunta intentaba lograr.
Recuerda que [ en esencia es solo un comando. Siempre acepta un número específico de parámetros y sale con el estado de salida 0 (éxito) o 1 (fallo), como lo hacen todos los demás comandos. Por ejemplo, cuando compara dos cadenas, la sintaxis es [ , cadena 1, == , cadena 2, ] .
En este momento estás usando esto como el if condición:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Pero es ambiguo en varios sentidos. ¿Cómo sería [ ¿Sabe que a la izquierda tiene un comando para ejecutar y no una cadena fija? ¿Cómo sabría que el == es el operador de comparación de cadenas, en lugar de solo un argumento para grep ? ¿Cómo sabría que el | es parte del valor de la izquierda, en lugar de separar el comando en [ prlctl list --info ubuntu-vm y grep State == "State: running" ] ?
Por lo tanto, el lado izquierdo también debe citarse. Además, dado que desea comparar la salida de ese comando, en lugar de los mundos "prctl list --info..." en sí mismos, necesita el $(…) operador:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]