Si, de lo contrario, se basa en el comando canalizado a grep

6

No puedo entender cómo hacer que este script (lo que se supone que sea simple) funcione. Básicamente lo que quiero, ejecutar diferentes cosas en función del estado de mi Parallels vm, algo como esto:

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

Por supuesto que no funciona

iLemming
fuente

Respuestas:

13

El problema es que lo está poniendo todo dentro [, es decir, el testcomando. Además, su uso de grepestá 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 -qcomo argumento para grep. No escribe nada en STDOUT y sale con un estado de 0 si se encuentra la coincidencia, y de lo contrario no es cero.

devnull
fuente
1
Una línea:prlctl list --info ubuntu-vm | grep -q "State: running" && echo "machine is running" || echo "machine is not running"
Noam Manos
2

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 ifcondició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-vmy 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" ]
Gravedad
fuente
+1 para la explicación detallada. ¿Puedo preguntarle dónde adquirió las habilidades de Shell-Scripting? Me encantaría leer algo sobre Shell, que entra en ese detalle, como que [es un comando, lo que probablemente le parezca muy extraño a alguien para quien solo conoce lenguajes como Java o Python.
Senkaku
1
@Creaturo: es un lenguaje de scripting por diseño, destinado a vincular comandos de shell, por lo que tiene sentido que la ifdeclaración acepte un comando arbitrario como condición ( if <command>; then <commands...>; fi). La sintaxis se describe en man bashsi está trabajando con el shell 'bash'.
Grawity
Esta fue una gran respuesta!
Mercutio