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