Il problema è che stai inserendo tutto in [ , ovvero il test comando. Inoltre, il tuo utilizzo di grep è rotto.
Tutto ciò di cui hai bisogno è:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Nota l'uso di -q come argomento di grep . Non scrive nulla su STDOUT ed esce con uno stato 0 se viene trovata la corrispondenza e diverso da zero in caso contrario.
Un controllo alternativo, meno "pulito" ma più vicino a ciò che la domanda cercava di ottenere.
Ricorda che [ al suo centro c'è solo un comando. Accetta sempre un numero specifico di parametri ed esce con lo stato di uscita 0 (successo) o 1 (fallimento), come fanno tutti gli altri comandi. Ad esempio, quando confronti due stringhe, la sintassi è [ , stringa 1, == , stringa 2, ] .
In questo momento lo stai usando come if condizione:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Ma è ambiguo in diversi modi. Come sarebbe [ sai che a sinistra hai un comando da eseguire e non una stringa fissa? Come farebbe a sapere che il file == è l'operatore di confronto tra stringhe, piuttosto che un semplice argomento per grep ? Come farebbe a sapere che il file | fa parte del valore a sinistra, piuttosto che separare il comando in [ prlctl list --info ubuntu-vm e grep State == "State: running" ] ?
Quindi anche il lato sinistro deve essere quotato. Inoltre, dal momento che vuoi confrontare l'output di quel comando, piuttosto che i mondi "prctl list --info..." stessi, hai bisogno del $(…) operatore:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]