Masalahnya adalah Anda memasukkan semuanya ke dalam [ , yaitu test memerintah. Selain itu, penggunaan grep Anda rusak.
Yang Anda butuhkan hanyalah:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
Perhatikan penggunaan -q sebagai argumen untuk grep . Itu tidak menulis apa pun ke STDOUT dan keluar dengan status 0 jika kecocokan ditemukan, dan bukan nol jika tidak.
Pemeriksaan alternatif, kurang "bersih" tetapi lebih dekat dengan apa yang ingin dicapai oleh pertanyaan tersebut.
Ingat bahwa [ pada intinya hanyalah sebuah perintah. Itu selalu menerima sejumlah parameter tertentu, dan keluar dengan status keluar 0 (sukses) atau 1 (gagal), seperti semua perintah lainnya. Misalnya, saat Anda membandingkan dua string, sintaksnya adalah [ , string 1, == , string 2, ] .
Saat ini Anda menggunakan ini sebagai if kondisi:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
Tapi itu ambigu dalam beberapa hal. Bagaimana [ tahu bahwa di sebelah kiri Anda memiliki perintah untuk dijalankan dan bukan string tetap? Bagaimana ia tahu bahwa == adalah operator pembanding string, bukan hanya argumen untuk grep ? Bagaimana ia tahu bahwa | adalah bagian dari nilai sebelah kiri, daripada memisahkan perintah menjadi [ prlctl list --info ubuntu-vm dan grep State == "State: running" ] ?
Jadi sisi kiri perlu dikutip juga. Juga, karena Anda ingin membandingkan output dari perintah itu, daripada dunia "prctl list --info..." itu sendiri, Anda memerlukan $(…) operator:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]