Bash: Pernyataan If / Else dalam satu baris

204

Saya mencoba untuk memeriksa apakah suatu proses (menganggap itu disebut some_process) berjalan di server. Jika ya, maka gema 1, jika tidak gema 0.

Ini adalah perintah yang saya gunakan tetapi hanya berfungsi sebagian (info lebih lanjut di bawah). Perhatikan bahwa saya perlu menulis skrip dalam satu baris.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

Catatan: The [s]dalam some_proces[s]adalah untuk mencegah grepdari kembali itu sendiri.

Jika some_processsedang berjalan, maka "1"akan digaungkan, yang baik-baik saja. Namun, jika some_processtidak berjalan, tidak ada yang digema.

Arthur Rimbun
sumber
4
Anda dapat menggunakan ps -Ccmduntuk menemukan proses yang nama perintahnya "cmd", yang sepenuhnya dapat menghilangkan grep. psakan menetapkan kode keluar ke beberapa nilai non-nol jika gagal menemukan proses yang cocok.
rici

Jawaban:

273

Tidak perlu memeriksa secara eksplisit $?. Kerjakan saja:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Perhatikan bahwa ini bergantung pada gema yang tidak gagal, yang tentu saja tidak dijamin. Cara yang lebih dapat diandalkan untuk menulis ini adalah:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi
William Pursell
sumber
9
Jika echo 1gagal, maka echo 0akan dieksekusi. Dalam hal ini, gema 1 tidak akan pernah gagal, tetapi Perhatikan bahwa A&& B || C tidak jika-maka-lain. C dapat berjalan ketika A benar. (Dari shellcheck ).
schemacs
@ schemacs membuat poin yang sangat valid: mengedit untuk memberikan alternatif yang jauh lebih baik.
William Pursell
2
Apakah perlu untuk mengarahkan kembali output dari perintah ps ke file? Apakah ini tidak akan berhasil? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. Tampaknya itu bekerja untuk saya. Apakah karena OP memiliki pengalihan perintah yang dia coba?
1
Sama sekali tidak perlu mengarahkan kembali output. Saya hanya meniru posisi semula, karena saya berasumsi hasilnya disimpan karena suatu alasan. Seringkali hal semacam ini hanya ditekan (dengan grep -qatau dialihkan ke / dev / null).
William Pursell
Saya akan menggunakan pgrep.
pawciobiel
67

&&berarti "dan jika berhasil"; dengan menempatkan ifpernyataan Anda di sebelah kanannya, Anda memastikan bahwa itu hanya akan berjalan jika grepkembali 0. Untuk memperbaikinya, gunakan ;:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(atau hanya menggunakan line-break).

ruakh
sumber
6
+1 Ini adalah jawaban yang jauh lebih baik, karena sebenarnya menjawab pertanyaan itu alih-alih hanya memberikan alternatif.
William Pursell
41

Gunakan grep -vcuntuk mengabaikan grepdalam psoutput dan menghitung garis secara bersamaan.

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi
John Gilmer
sumber
15

Anda dapat memanfaatkan sepenuhnya operator &&dan ||seperti ini:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

Untuk mengecualikan grep itu sendiri, Anda juga dapat melakukan sesuatu seperti:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0
Costi Ciudatu
sumber
2
pgrep -q some_process && echo 1 || echo 0

lebih banyak oneliners di sini

sekali
sumber