Una verificación alternativa, menos "limpia" pero más cercana a lo que la pregunta intentó lograr.
Recuerde 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 (falla), como lo hacen todos los demás comandos. Por ejemplo, cuando usted está comparando dos secuencias, la sintaxis es [
, la cadena 1, ==
, cadena 2, ]
.
En este momento estás usando esto como if
condición:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Pero es ambiguo de varias maneras. ¿Cómo [
sabría que a la izquierda tiene un comando para ejecutar y no una cadena fija? ¿Cómo sabría que ==
es el operador de comparación de cadenas, en lugar de solo un argumento para grep
? ¿Cómo sabría que |
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 ser citado. Además, dado que desea comparar la salida de ese comando, en lugar de la "prctl list --info ..." del mundo, necesita el $(…)
operador:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]
prlctl list --info ubuntu-vm | grep -q "State: running" && echo "machine is running" || echo "machine is not running"