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