Si, sinon, basé sur la commande canalisée vers grep

6

Je n'arrive pas à comprendre comment faire fonctionner ce script (supposé être simple). Ce que je veux, en gros, exécuter différentes choses en fonction de l’état de mon ordinateur Parallels, par exemple:

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

Bien sûr ça ne marche pas

iLemming
la source

Réponses:

13

Le problème est que vous mettez tout cela dans [la testcommande. De plus, votre utilisation de grepest cassée.

Tout ce dont tu as besoin c'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 -qcomme argument pour grep. Il n'écrit rien dans STDOUT et quitte avec un statut égal à 0 si la correspondance est trouvée et différent de zéro sinon.

devnull
la source
Un exemple:prlctl list --info ubuntu-vm | grep -q "State: running" && echo "machine is running" || echo "machine is not running"
Noam Manos le
2

Une vérification alternative, moins "propre" mais plus proche de ce que la question tentait de réaliser.

Rappelez-vous qu’en [son cœur n’est qu’une commande. Il accepte toujours un nombre spécifique de paramètres et quitte avec le statut de sortie 0 (succès) ou 1 (échec), comme le font toutes les autres commandes. Par exemple, lorsque vous comparez deux chaînes, la syntaxe est [, chaîne 1, ==, chaîne 2, ].

À l'heure actuelle, vous utilisez ceci comme ifcondition:

[ prlctl list --info ubuntu-vm | grep State == "State: running" ]

Mais c'est ambigu à plusieurs égards. Comment [savoir que sur la gauche vous avez une commande à exécuter et non une chaîne fixe? Comment pourrait-il savoir que l' ==opérateur de comparaison de chaînes est plutôt qu'un simple argument grep? Comment pourrait-il savoir que cela |fait partie de la valeur de gauche plutôt que de séparer la commande en [ prlctl list --info ubuntu-vmet grep State == "State: running" ]?

Donc, le côté gauche doit également être cité. De plus, puisque vous voulez comparer le résultat de cette commande, plutôt que les "prctl list --info ..." des mondes eux-mêmes, vous avez besoin de l' $(…)opérateur:

[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]
Grawity
la source
+1 pour l'explication détaillée. Puis-je vous demander: Où avez-vous acquis vos compétences en script shell? J'aimerais lire quelque chose à propos du Shell, qui entre dans ces détails, comme [une commande, ce qui semble probablement très étranger à quelqu'un pour qui ne connaît que des langages comme Java ou Python.
Senkaku
1
@Creaturo: C'est un langage de script par sa conception, destiné à relier des commandes shell, il est donc logique que l' ifinstruction accepte une commande arbitraire en tant que condition ( if <command>; then <commands...>; fi). La syntaxe est décrite dans man bashsi vous travaillez avec le shell 'bash'.
grawity
C'était une excellente réponse!
Mercutio