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