คุณยังคงประโยคต่อไปได้อย่างไรด้วยคำสั่งภายใน


12

ตัวอย่างเช่นฉันพยายามพูดว่า "มี 10 คนออนไลน์ในขณะนี้" ในไฟล์สคริปต์ของฉัน

ฉันไม่สามารถดูเหมือนจะได้รับคำสั่งทำงานโดยไม่มีส่วน "คนออนไลน์ในขณะนี้" ในบรรทัดถัดไป

ในตอนนี้ฉันมี

w='who | wc -l' 
echo "There are $w people online at the moment" 

อย่างไรก็ตามฉันมักจะจบลงด้วยการส่งออก

There are who | wc -l users online at the moment 

คุณจะทำให้คำสั่งทำงานตรงกลางได้อย่างไร? ฉันพยายามตรวจสอบและคัดลอกตัวอย่างแล้ว แต่ดูเหมือนจะไม่ช่วยให้ปัญหาการทดแทนคำสั่งของฉัน

คำตอบ:


20

คุณต้องการผลลัพธ์ของ

who | wc -l

กำหนดให้wไม่ใช่สตริงนั้นซึ่งเป็นสิ่งที่คุณได้รับเนื่องจากเครื่องหมายคำพูดรอบ ๆ คุณควรใช้การทดแทนคำสั่ง$(...):

w=$(who | wc -l)
echo "There are $w people online at the moment"

(คุณสามารถใช้ backquotes แต่คุณไม่สามารถซ้อนมันได้อย่างง่ายดาย)


ในเชลล์บางตัวรวมถึง Bash คุณสามารถซ้อน backquotes ได้ มันต้องมีการหลบหนีซ้อนกันดูตัวอย่างได้ที่stackoverflow.com/a/2657037/776723
ShadSterling

1
@ Polyergic ขอบคุณ ฉันอัปเดตคำตอบของฉันแล้ว แต่ฉันคิดว่าฉันจะติดกับการทำรัง$()เอง ;-)
Anthon


5

คุณควรใช้ backtick เพื่อดำเนินการคำสั่ง

w=`who | wc -l` echo "There are $w people online at the moment"



7
จุดที่ถูกต้อง "backtick ยังสับสนได้ง่ายด้วยการพูดเพียงคำเดียว" สิ่งที่เกิดขึ้นที่นี่
Ghanima

@Ghanima: แน่นอน! คำถามนี้เป็นตัวอย่างที่ดีสำหรับเวลาที่เราต้องการแสดงให้เห็นว่าเหตุใดจึงควรหลีกเลี่ยง Backticks :)
PM 2Ring

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