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