Le problème est que vous mettez tout dans [ , soit le test commande. De plus, votre utilisation de grep est cassé.
Tout ce dont vous avez besoin est :
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Notez l'utilisation de -q comme argument de grep . Il n'écrit rien dans STDOUT et se termine avec un statut de 0 si la correspondance est trouvée, et différent de zéro sinon.
Une vérification alternative, moins "propre" mais plus proche de ce que la question tentait d'atteindre.
N'oubliez pas que [ à sa base est juste une commande. Elle accepte toujours un nombre spécifique de paramètres et se termine avec l'état de sortie 0 (succès) ou 1 (échec), comme toutes les autres commandes. Par exemple, lorsque vous comparez deux chaînes, la syntaxe est [ , chaîne 1, == , chaîne 2, ] .
En ce moment, vous utilisez ceci comme if condition :
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Mais il est ambigu à plusieurs égards. Comment [ savez-vous que sur la gauche vous avez une commande à exécuter et non une chaîne fixe ? Comment saurait-il que le == est l'opérateur de comparaison de chaînes, plutôt qu'un simple argument de grep ? Comment saurait-il que le | fait partie de la valeur de gauche, plutôt que de séparer la commande en [ prlctl list --info ubuntu-vm et grep State == "State: running" ] ?
Ainsi, le côté gauche doit également être cité. De plus, puisque vous voulez comparer la sortie de cette commande, plutôt que les mondes "prctl list --info..." eux-mêmes, vous avez besoin du $(…) opérateur :
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]