Bagaimana cara mengevaluasi hasil grep dalam bash?

2

Saya ingin memahami status layanan tertentu ( tomcat8.service).

Hanya jika string itu ditemukan, saya ingin menjalankan beberapa logika.

Masalah: bahkan jika saya menjalankan skrip pada nama layanan yang tidak ada ("asd" dalam contoh ini), if $statusmasih cocok dan dicetak. Tapi kenapa?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

Hasil keluaran adalah:, asd.service was activeyang tentu saja tidak benar.

The echo $statuscetakan:status: Unknown job: =

anggota
sumber
Saya akan mengubah judul pertanyaan dengan apa yang ingin Anda capai (yaitu: menjalankan perintah tergantung pada status layanan), alih-alih bagaimana Anda pikir Anda bisa melakukannya (yaitu: mengevaluasi hasil grep). Sebagai jawaban menyatakan, grep tidak diperlukan.
Gonzalo Matheu

Jawaban:

2

Anda dapat menggunakan status pengembalian grep.

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

atau bahkan lebih mudah:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

atau jika Anda lebih suka if:

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

Anyways, mengurus tentang kata kunci inactive, not active, active (exited)atau sama. Ini juga akan cocok dengan greppernyataan Anda . Lihat komentarnya. Terima kasih @ Terrance untuk petunjuknya.


Memperbarui:

Tidak perlu grep. systemctlsudah is-activetermasuk perintah .

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

atau:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
pLumo
sumber
Karena ifmenggunakan kode pengembalian, Anda hanya dapat menggunakanif systemctl status asd.service | grep 'active'; then ...
Florian Diesch
benar. terima kasih atas petunjuknya, perbarui jawabannya. Tetapi diperlukan $ (...)
pLumo
Saran terakhir sangat bagus!
membersound
Masalah dengan melakukan grep 'active'adalah bahwa ia akan menemukan inactivejuga active. grep -w activehanya akan menemukan activedan mengabaikan inactive.
Terrance
1
bagaimana mungkin kita merindukan systemctl is-active?
pLumo
0

Beberapa komentar ulasan kode:

  • tugas variabel sh / bash / ksh / zsh terlihat seperti var=value- tidak ada spasi di sekitar =yang diizinkan. ( dokumentasi )
  • status=$(some command)- variabel status menahan output dari perintah, bukan status keluar. Status keluar dalam $?variabel
  • yang ifbertindak pernyataan di status keluar dari perintah berikutnya ( dokumentasi )

    if some_comment; then action1; else action2; fi

    Paling sering, perintahnya adalah [atau [[untuk menguji beberapa kondisi.

    Namun, grepmemiliki status keluar yang jelas: 0 jika pola ditemukan, 1 sebaliknya. Jadi, Anda menginginkan ini:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    
glenn jackman
sumber