Problém je v tom, že to všechno dáváte do [ , tj. test příkaz. Navíc vaše použití grep je rozbitý.
Vše, co potřebujete, je:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Všimněte si použití -q jako argument pro grep . Nezapíše nic do STDOUT a skončí se stavem 0, pokud je nalezena shoda, a jinak nenulovou.
Alternativní kontrola, méně „čistá“, ale blíže tomu, čeho se otázka snažila dosáhnout.
Pamatujte, že [ v jádru je jen příkaz. Vždy přijímá určitý počet parametrů a ukončí se buď se stavem ukončení 0 (úspěch) nebo 1 (selhání), stejně jako všechny ostatní příkazy. Když například porovnáváte dva řetězce, syntaxe je[ , řetězec 1, == , řetězec 2, ] .
Právě teď to používáte jako if podmínka:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Ale je to v několika ohledech nejednoznačné. Jak by [ víte, že vlevo máte příkaz ke spuštění a ne pevný řetězec? Jak to může vědět, že == je operátor porovnání řetězců, spíše než jen argument pro grep ? Jak to může vědět, že | je součástí hodnoty na levé straně, spíše než oddělení příkazu do [ prlctl list --info ubuntu-vm a grep State == "State: running" ] ?
Takže levá strana musí být také citována. Také proto, že chcete porovnat výstup tohoto příkazu, spíše než samotný světový "prctl list --info...", potřebujete $(…) operátor:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]