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
prlctl list --info ubuntu-vm | grep -q "State: running" && echo "machine is running" || echo "machine is not running"
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: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 paragrep
? ¿Cómo sabría que|
es parte del valor de la izquierda, en lugar de separar el comando en[ prlctl list --info ubuntu-vm
ygrep 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:fuente
[
es un comando, lo que probablemente le parezca muy extraño a alguien para quien solo conoce lenguajes como Java o Python.if
declaración acepte un comando arbitrario como condición (if <command>; then <commands...>; fi
). La sintaxis se describe enman bash
si está trabajando con el shell 'bash'.