Bash: คำสั่ง If / Else ในหนึ่งบรรทัด


204

ฉันพยายามตรวจสอบว่ากระบวนการ (สมมติว่าเรียกว่าsome_process) กำลังทำงานบนเซิร์ฟเวอร์หรือไม่ ถ้าเป็นเช่นนั้นสะท้อน 1 หรือมิฉะนั้นสะท้อน 0

นี่คือคำสั่งที่ฉันใช้ แต่ใช้งานได้เพียงบางส่วนเท่านั้น (ข้อมูลเพิ่มเติมด้านล่าง) โปรดทราบว่าฉันต้องเขียนสคริปต์ในหนึ่งบรรทัด

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

หมายเหตุ:การ[s]ในsome_proces[s]คือการป้องกันไม่ให้grepกลับมาเอง

หากsome_processกำลังทำงานอยู่"1"จะได้รับเสียงสะท้อนซึ่งไม่เป็นไร อย่างไรก็ตามหากsome_processไม่ได้ใช้งานจะไม่มีสิ่งใดสะท้อนกลับมา


4
คุณสามารถใช้ps -Ccmdเพื่อหากระบวนการที่มีชื่อคำสั่งคือ "cmd" grepที่สมบูรณ์สามารถกำจัด psจะตั้งรหัสออกให้ค่าที่ไม่เป็นศูนย์หากไม่พบกระบวนการที่ตรงกัน
rici

คำตอบ:


273

$?ไม่จำเป็นต้องมีการตรวจสอบอย่างชัดเจนคือ แค่ทำ:

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

โปรดทราบว่าสิ่งนี้ต้องอาศัยเสียงสะท้อนที่ไม่ล้มเหลว วิธีการเขียนที่น่าเชื่อถือมากขึ้นคือ:

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

9
หากecho 1ล้มเหลวระบบecho 0จะดำเนินการ ในกรณีนี้เสียงสะท้อน 1 จะไม่ล้มเหลว แต่โปรดทราบว่า A&& B || C ไม่ใช่ถ้าเป็นอย่างอื่น C อาจทำงานเมื่อ A เป็นจริง (จากshellcheck )
schemacs

@ schemacs ทำให้ประเด็นที่ถูกต้องมาก: การแก้ไขเพื่อให้ทางเลือกที่ดีกว่ามาก
วิลเลียม Pursell

2
จำเป็นต้องส่งเอาต์พุตคำสั่ง ps ไปยังไฟล์อีกครั้งหรือไม่? สิ่งนี้จะใช้งานไม่ได้หรือ if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. ในประเทศดูเหมือนว่าจะทำงานให้ฉัน เป็นเพราะ OP มีการเปลี่ยนเส้นทางในคำสั่งที่เขาลองหรือไม่

1
ไม่จำเป็นต้องเปลี่ยนเส้นทางเอาต์พุตอย่างแน่นอน ฉันแค่ลิงตำแหน่งเดิมเนื่องจากฉันคิดว่าผลลัพธ์จะถูกบันทึกไว้ด้วยเหตุผล บ่อยครั้งที่สิ่งแบบนี้ถูกระงับไว้เพียง ( grep -qหรือเปลี่ยนเส้นทางไปยัง / dev / null)
William Pursell

pgrepผมจะใช้
pawciobiel

67

&&หมายถึง "และหากสำเร็จ"; โดยการวางของifคำสั่งทางด้านขวามือของมันคุณมั่นใจได้ว่ามันจะทำงานถ้าผลตอบแทนgrep 0หากต้องการแก้ไขให้ใช้;แทน:

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

(หรือใช้การแบ่งบรรทัด)


6
+1 นี่เป็นคำตอบที่ดีกว่ามากเพราะเป็นคำตอบที่ตรงข้ามกับการให้ทางเลือก
William Pursell

41

ใช้grep -vcเพื่อละเว้นgrepในpsเอาต์พุตและนับบรรทัดพร้อมกัน

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

15

คุณสามารถใช้ประโยชน์อย่างเต็มที่จากตัวดำเนินการ&&และ||ตัวดำเนินการดังนี้:

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

สำหรับการยกเว้น grep เองคุณสามารถทำสิ่งต่อไปนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.