Bash: Bir satırda If / Else ifadesi


205

Bir işlem (çağrıldığını varsayalım some_process) bir sunucuda çalışıp çalışmadığını kontrol etmeye çalışıyorum . Öyleyse, yankı 1, aksi takdirde yankı 0.

Bu kullanıyorum komut ama sadece kısmen çalışır (daha fazla bilgi aşağıda). Komut dosyasını bir satıra yazmam gerektiğini unutmayın.

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

Not:[s] in some_proces[s]önlemektir grepkendisini döndürmesini.

Eğer some_processçalışıyorsa, "1"yankılanır, bu da iyidir. Ancak, some_processçalışmazsa hiçbir şey yankılanmaz.


4
ps -CcmdKomut adı "cmd" olan işlemleri tamamen bulmak için kullanabilirsiniz grep. pseşleşen bir işlem bulamazsa çıkış kodunu sıfır dışında bir değere ayarlar.
rici

Yanıtlar:


277

Açık bir şekilde kontrol etmeye gerek yoktur $?. Sadece yap:

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

Bunun yankılanmayan yankıya dayandığını ve bu kesinlikle garanti edilmediğini unutmayın. Bunu yazmanın daha güvenilir bir yolu:

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

9
Eğer echo 1başarısız, o zaman echo 0çalıştırılacaktır. Bu durumda, yankı 1 asla başarısız olmaz, ancak A && B || C if-then-else değil. C, A doğru olduğunda çalışabilir ( kabuk kontrolünden ).
şemalar

@schemacs çok geçerli bir noktaya işaret ediyor: çok daha iyi bir alternatif sağlamak için düzenleme.
William Pursell

2
Ps komutunun çıktısını bir dosyaya yeniden yönlendirmek gerekli mi? Bu işe yaramaz mı? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. Yerel olarak benim için çalışıyor gibi görünüyor. OP'nin denediği komuta yönlendirmesi olduğu için mi?

1
Çıktıyı yeniden yönlendirmeye kesinlikle gerek yoktur. Çıktının bir nedenden ötürü kaydedildiğini varsaydığım için sadece orijinal pozisyondan maymunum. Genellikle bu tür şeyler yalnızca bastırılır ( grep -q/ dev / null ile veya ona yönlendirme).
William Pursell

Kullanırdım pgrep.
pawciobiel

68

&&"ve başarılıysa" anlamına gelir; ifadenizi ifsağ tarafına yerleştirerek, ifadenin yalnızca grepdöndürürse çalışmasını sağlarsınız 0. Düzeltmek için şunu ;kullanın:

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

(veya yalnızca satır sonu kullanın).


6
+1 Bu, sadece bir alternatif sunmanın aksine soruyu cevapladığı için çok daha iyi bir cevaptır.
William Pursell

42

Kullan grep -vcgörmezden grepiçinde psçıktı ve aynı anda satırları saymak.

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

15

&&Ve ||gibi operatörleri tam olarak kullanabilirsiniz :

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

Grep'in kendisini hariç tutmak için aşağıdakine de benzer bir şey yapabilirsiniz:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.