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

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.


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

+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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.