ใน zsh ให้${$(pwd)}ส่งออกไดเรกทอรีปัจจุบัน อย่างไรก็ตามถ้าฉันวิ่งecho ${/path/to/somewhere}มันแค่แสดงบรรทัดว่างเปล่า ทำไมสิ่งนี้ถึงเกิดขึ้น ขอบคุณ!
ใน zsh ให้${$(pwd)}ส่งออกไดเรกทอรีปัจจุบัน อย่างไรก็ตามถ้าฉันวิ่งecho ${/path/to/somewhere}มันแค่แสดงบรรทัดว่างเปล่า ทำไมสิ่งนี้ถึงเกิดขึ้น ขอบคุณ!
คำตอบ:
ฉันคิดว่าคุณพูดprint ${$(pwd)}หรืออะไรแบบนั้นใช่มั้ย!
การขยาย ${$(pwd)}ไปยังไดเรกทอรีการทำงานปัจจุบันเป็นลักษณะการทำงานที่คาดไว้แม้ว่ามันจะดูแปลก ๆ ในแวบแรก อย่าปล่อยให้คุณโง่โดยคิดว่าการทดแทนคำสั่ง$(pwd)จะถูกประเมินก่อนผลลัพธ์จะถูกใช้เป็นชื่อตัวแปร ... ไม่มันถูกใช้เป็นค่าตัวแปร ตามที่man zshexpnอธิบายไว้:
${name}ค่าถ้ามีของชื่อพารามิเตอร์จะถูกแทนที่( ... ) ถ้า
${...}การแสดงออกประเภทพารามิเตอร์หรือ$(...)เปลี่ยนตัวประเภทคำสั่งที่ใช้ในสถานที่ของข้างต้นก็จะขยายตัวเป็นครั้งแรกและผลที่ได้จะใช้เป็นว่ามันเป็นค่าของnamename(... ) แบบฟอร์มที่$(...)มักมีประโยชน์เมื่อใช้ร่วมกับค่าสถานะที่อธิบายไว้ถัดไป ดูตัวอย่างด้านล่าง(... ) การตั้งค่าสถานะ f มีประโยชน์ในการแบ่งบรรทัดการแทนที่แบบสองบรรทัดต่อบรรทัด ตัวอย่างเช่น
${(f)"$(<file)"}แทนที่เนื้อหาของไฟล์ที่ถูกแบ่งเพื่อให้แต่ละบรรทัดเป็นองค์ประกอบของอาร์เรย์ผลลัพธ์
ตัวอย่างที่สองของคุณ ฉันคิดว่านี่เป็นรูปแบบแทนที่ไวยากรณ์:
${name/pattern/repl}แทนที่การจับคู่รูปแบบที่ยาวที่สุดที่เป็นไปได้ในการขยายชื่อพารามิเตอร์โดยการแทนที่สตริง ( ... )
ดูตัวอย่างนี้ก่อน:
$ foo=hello
$ print ${foo/hello/good/bye}
good/bye
หากคุณไม่fooระบุzshให้ทำการค้นหาและแทนที่ในตัวแปร${}ซึ่งว่างเปล่า:
$ print ${}
$
- ดังนั้น${/something/foo/bar}จะส่งคืนสตริงว่างด้วย