Das Problem ist, dass Sie alles in [
einfügen , also die test
Befehl. Außerdem Ihre Nutzung von grep
ist kaputt.
Alles, was Sie brauchen, ist:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Beachten Sie die Verwendung von -q
als Argument für grep
. Es schreibt nichts nach STDOUT und beendet sich mit einem Status von 0, wenn die Übereinstimmung gefunden wird, und andernfalls ungleich Null.
Eine alternative Überprüfung, weniger "sauber", aber näher an dem, was die Frage erreichen wollte.
Denken Sie daran, [
im Kern ist es nur ein Befehl. Es akzeptiert immer eine bestimmte Anzahl von Parametern und beendet sich wie alle anderen Befehle mit dem Exit-Status 0 (Erfolg) oder 1 (Fehler). Wenn Sie beispielsweise zwei Zeichenfolgen vergleichen, lautet die Syntax [
, Zeichenfolge 1, ==
, Zeichenfolge 2, ]
.
Im Moment verwenden Sie dies als if
Bedingung:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Aber es ist in mehrfacher Hinsicht mehrdeutig. Wie würde [
Wissen Sie, dass Sie auf der linken Seite einen auszuführenden Befehl und keine feste Zeichenfolge haben? Woher weiß es, dass ==
ist der Zeichenfolgenvergleichsoperator und nicht nur ein Argument für grep
? Woher weiß es, dass |
ist Teil des linken Werts, anstatt den Befehl in [ prlctl list --info ubuntu-vm
zu trennen und grep State == "State: running" ]
?
Also muss auch die linke Seite zitiert werden. Außerdem möchten Sie die Ausgabe vergleichen dieses Befehls, statt der Welten "prctl list --info..." selbst, benötigen Sie den $(…)
Betreiber:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]