วิธีการทำคำสั่ง if จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน


54

ฉันกำลังพยายามทำคำสั่ง IF จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน นี่คือวิธีที่ฉันพยายามทำ แต่ไม่ได้ผล ไม่มีใครรู้วิธีที่ถูกต้องในการทำเช่นนี้?

if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
  echo "Found a Tomcat!"
fi

คำตอบ:


65

ใช้การ[[สร้างเงื่อนไขแบบbash และต้องการใช้หลักการแทนที่คำสั่ง$(<command> )นอกจากนี้[[ป้องกันการแบ่งคำของค่าตัวแปรดังนั้นจึงไม่จำเป็นต้องอ้างถึงบิตการแทนที่คำสั่ง ..

if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
  echo "Found a Tomcat!"
fi

30

อีกทางเลือกหนึ่งคือทดสอบสถานะทางออกของgrepตัวเองซึ่งจะคืนค่าเท็จ (1) หากไม่มีการจับคู่และจริง (0) หากมีอยู่โดยไม่ได้ใช้[คำสั่ง

if netstat -lntp | grep ':8080.*java' > /dev/null; then
    echo "Found a Tomcat!"
fi

การเปลี่ยนเส้นทางไปยัง / dev / null คือการป้องกันไม่ให้มันพิมพ์บรรทัดที่พบไปยังหน้าจอ


12
จดบันทึก-qตัวเลือกเพื่อ grep แทนการเปลี่ยนเส้นทางไปยัง / dev / null ด้วย-qgrep จะไม่แสดงผลใด ๆ และหยุดค้นหาหลังจากคู่แรก
Stéphane Chazelas

5

ง่ายยิ่งขึ้น

netstat -lntp | grep ':8080.*java' > /dev/null && command

หากคุณต้องการทำสิ่งหนึ่ง


4

คุณสามารถจับคู่กับ awk ที่แม่นยำยิ่งขึ้นและเรียบง่ายขึ้นได้

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /java/ {exit(0)} END {exit(1)}'; then 

เพื่อให้ตรงกับโครงสร้างของคำสั่งของคุณอย่างใกล้ชิดยิ่งขึ้นวิธีพกพาในการจับคู่ไวด์การ์ดบนสตริงในเชลล์จะมีcaseโครงสร้าง

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac

0

อีกตัวอย่างในโลกแห่งความจริง :)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi

อะไรHEADทำอย่างไร นั่นคือฟังก์ชั่นหรือนามแฝงที่กำหนดเองในระบบของคุณ?
luckman212

usr/bin/HEAD → lwp-request. และ LWP คำขอที่ดูเหมือนจะเป็นคนนี้ ไม่แน่ใจว่าฉันมาที่นี่ได้อย่างไร มีปรากฏเป็นตัวพิมพ์เล็กเช่นกันusr/bin/head
Frank Nocke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.