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" ]