ฉันลองคำสั่ง
$ b=5; echo `$b`;
-bash: 5: command not found
แต่จะไม่พิมพ์ 5 อย่างที่ควรจะเป็น สิ่งที่ฉันหายไปที่นี่?
`(backquote / backtick) หมายถึงอะไรในคำสั่ง? ดูเหมือนว่าจะ`
ประเมินคำสั่งภายในและแทนที่พวกเขาด้วยการส่งออก
ฉันลองคำสั่ง
$ b=5; echo `$b`;
-bash: 5: command not found
แต่จะไม่พิมพ์ 5 อย่างที่ควรจะเป็น สิ่งที่ฉันหายไปที่นี่?
`(backquote / backtick) หมายถึงอะไรในคำสั่ง? ดูเหมือนว่าจะ`
ประเมินคำสั่งภายในและแทนที่พวกเขาด้วยการส่งออก
คำตอบ:
ข้อความระหว่าง backticks จะถูกเรียกใช้งานและแทนที่ด้วยเอาต์พุตของคำสั่ง (ลบอักขระบรรทัดใหม่ต่อท้ายและระวังว่าพฤติกรรมของเชลล์จะแตกต่างกันไปเมื่อมีอักขระ NUL ในเอาต์พุต) ที่เรียกว่าการทดแทนคำสั่งเพราะมันถูกแทนที่ด้วยเอาท์พุทของคำสั่ง ดังนั้นหากคุณต้องการที่จะพิมพ์ 5 คุณไม่สามารถใช้ backticks คุณสามารถใช้เครื่องหมายคำพูดเหมือนecho "$b"
หรือเพียงแค่วางคำพูดใด ๆ echo $b
และการใช้งาน
อย่างที่คุณเห็นเนื่องจาก$b
มี 5 เมื่อใช้ backticks bash
พยายามเรียกใช้คำสั่ง5
และเนื่องจากไม่มีคำสั่งดังกล่าวจึงล้มเหลวพร้อมข้อความแสดงข้อผิดพลาด
เพื่อให้เข้าใจถึงวิธีการทำงานของแบ็คทริคให้ลองใช้วิธีนี้:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
ควรพิมพ์บรรทัดแรกของ/etc/passwd
ไฟล์ แต่เนื่องจากเราใช้ backticks จึงไม่พิมพ์บนคอนโซล แต่จะเก็บไว้ในA
ตัวแปรแทน คุณสามารถสะท้อน$A
ถึงสิ่งนี้ โปรดทราบว่าวิธีที่มีประสิทธิภาพมากขึ้นในการพิมพ์บรรทัดแรกคือการใช้คำสั่งhead -n1 /etc/passwd
แต่ฉันต้องการชี้ให้เห็นว่าการแสดงออกภายใน backticks นั้นไม่จำเป็นต้องง่าย
ดังนั้นถ้าบรรทัดแรกของ / etc / passwd เป็นคำสั่งแรกจะถูกแทนที่แบบไดนามิกโดยทุบตีไปroot:x:0:0:root:/root:/bin/bash
A="root:x:0:0:root:/root:/bin/bash"
โปรดทราบว่าไวยากรณ์นี้เป็นของเชลล์เป้าหมาย การเขียนและหลบหนีกลายเป็นฝันร้ายอย่างรวดเร็วโดยเฉพาะเมื่อคุณเริ่มทำรัง Ksh แนะนำ$(...)
ทางเลือกซึ่งตอนนี้เป็นมาตรฐาน ( POSIX ) และสนับสนุนโดยเชลล์ทั้งหมด (แม้แต่เชลล์เป้าหมายจาก Unix v9) ดังนั้นคุณควรใช้$(...)
แทนทุกวันนี้เว้นแต่คุณจะต้องพกพาไปได้ที่บอร์นเชลล์เก่ามาก
โปรดทราบว่าเอาต์พุตของ`...`
และ$(...)
อาจมีการแยกคำและสร้างชื่อไฟล์เช่นการขยายตัวตัวแปร (ใน zsh, การแยกคำเท่านั้น) ดังนั้นโดยทั่วไปจะต้องมีการยกมาในรายการบริบท
you can use quotation marks, like echo "$b"
=> "" ทำอะไรเป็นพิเศษหรือไม่ ดูเหมือนว่าecho $b
จะใช้งานได้เช่นกัน
echo
คำสั่งไม่สนใจจำนวนอาร์กิวเมนต์ที่ได้รับดังนั้นหากb
มีช่องว่างบางส่วนภายในจะได้รับอาร์กิวเมนต์หลายตัวและจะพิมพ์ออกมา นี่อาจไม่เป็นกรณีสำหรับคำสั่งอื่น ๆ (โดยเฉพาะเมื่อไม่ได้ตั้งค่าตัวแปร) ดังนั้นฉันมักจะล้อมรอบตัวแปรด้วยเครื่องหมายคำพูดเสมอ
(POSIX)
เป็นลิงค์ไปยังมาตรฐานจริง
Backtick ทำสิ่งที่คุณพูดอย่างแน่นอน คุณตั้งค่าตัวแปรเป็นจำนวนเต็ม เมื่อคุณวางตัวแปรนั้นไว้ใน backticks bash จะพยายามเรียกใช้มันเป็นคำสั่ง เนื่องจากไม่ใช่คำสั่งคุณจะได้รับข้อผิดพลาดที่คุณเห็น
สิ่งที่คุณต้องการทำคือ:
$ b=5; echo $b
หากต้องการทำความเข้าใจ backticks ให้ดีขึ้นเปรียบเทียบกับ:
$ b=5; a=`echo $b`; echo $a
5
การอธิบายอย่างเป็นขั้นเป็นตอนควรอธิบายให้เข้าใจ
$ b=5; echo `$b`;
b
เป็น 5$b
(ทำงานอย่างมีประสิทธิภาพ5
)echo
เป็นผลลัพธ์ของการประเมินผลข้างต้นใช่แล้วผลลัพธ์ที่คุณได้รับคาดว่าจะได้ คุณกำลังประเมินเนื้อหาของตัวแปรไม่ใช่คำสั่งจริงที่คุณคิดว่าเป็น ทุกสิ่งที่คุณใส่ไว้ใน backticks นั้นจะถูกประเมินโดย simplay (runned) ในเชลล์ (sub) ใหม่