ฉันกำลังพยายามทำคำสั่ง IF จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน นี่คือวิธีที่ฉันพยายามทำ แต่ไม่ได้ผล ไม่มีใครรู้วิธีที่ถูกต้องในการทำเช่นนี้?
if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
echo "Found a Tomcat!"
fi
ฉันกำลังพยายามทำคำสั่ง IF จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน นี่คือวิธีที่ฉันพยายามทำ แต่ไม่ได้ผล ไม่มีใครรู้วิธีที่ถูกต้องในการทำเช่นนี้?
if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
echo "Found a Tomcat!"
fi
คำตอบ:
ใช้การ[[
สร้างเงื่อนไขแบบbash และต้องการใช้หลักการแทนที่คำสั่ง$(
<command> )
นอกจากนี้[[
ป้องกันการแบ่งคำของค่าตัวแปรดังนั้นจึงไม่จำเป็นต้องอ้างถึงบิตการแทนที่คำสั่ง ..
if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
echo "Found a Tomcat!"
fi
อีกทางเลือกหนึ่งคือทดสอบสถานะทางออกของgrep
ตัวเองซึ่งจะคืนค่าเท็จ (1) หากไม่มีการจับคู่และจริง (0) หากมีอยู่โดยไม่ได้ใช้[
คำสั่ง
if netstat -lntp | grep ':8080.*java' > /dev/null; then
echo "Found a Tomcat!"
fi
การเปลี่ยนเส้นทางไปยัง / dev / null คือการป้องกันไม่ให้มันพิมพ์บรรทัดที่พบไปยังหน้าจอ
ง่ายยิ่งขึ้น
netstat -lntp | grep ':8080.*java' > /dev/null && command
หากคุณต้องการทำสิ่งหนึ่ง
คุณสามารถจับคู่กับ 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
อีกตัวอย่างในโลกแห่งความจริง :)
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
ทำอย่างไร นั่นคือฟังก์ชั่นหรือนามแฝงที่กำหนดเองในระบบของคุณ?
usr/bin/HEAD → lwp-request
. และ LWP คำขอที่ดูเหมือนจะเป็นคนนี้ ไม่แน่ใจว่าฉันมาที่นี่ได้อย่างไร มีปรากฏเป็นตัวพิมพ์เล็กเช่นกันusr/bin/head
-q
ตัวเลือกเพื่อ grep แทนการเปลี่ยนเส้นทางไปยัง / dev / null ด้วย-q
grep จะไม่แสดงผลใด ๆ และหยุดค้นหาหลังจากคู่แรก