$ {0 ## * /} และ $ {0% / *} ทำงานอย่างไร


33

ฉันค่อนข้างสับสนเกี่ยวกับการแสดงออกปกติต่อไปนี้ที่ฉันพบในเชลล์สคริปต์

${0##*/}
${0%/*}

พวกเขาทำงานอย่างไร

คำตอบ:


38

สิ่งเหล่านี้ไม่ใช่นิพจน์ทั่วไปเป็นตัวอย่างของการขยายพารามิเตอร์ของ Bash: การแทนที่ของตัวแปรหรือพารามิเตอร์พิเศษด้วยค่าของมัน Wooledge วิกิพีเดียมีคำอธิบายที่ดี

โดยทั่วไปในตัวอย่างที่คุณมี${0##*/}แปลว่า:

สำหรับตัวแปร $ 0 และรูปแบบ '/' แฮชสองค่าเฉลี่ยจากจุดเริ่มต้นของพารามิเตอร์ลบการจับคู่ที่ยาวที่สุด (หรือโลภ) - จนถึงและรวมถึงรูปแบบ

ดังนั้นที่ไหน$0คือชื่อของไฟล์เช่น. $HOME/documents/doc.txt, จากนั้นพารามิเตอร์จะถูกขยายเป็น:doc.txt

ในทำนองเดียวกันสำหรับ${0%/*}รูปแบบ/จะถูกจับคู่กับจุดสิ้นสุดของพารามิเตอร์ (คน%) กับการแข่งขันที่สั้นที่สุดหรือไม่โลภลบ - $HOME/documentsซึ่งในตัวอย่างข้างต้นจะให้คุณ

ดูเพิ่มเติมบทความบนHacker ทุบตีของวิกิพีเดีย


2
ดังนั้น ... พวกเขาไม่ต้องการใช้basenameและdirname? : D
Aaron D. Marasco

8
ข้อได้เปรียบอย่างหนึ่งคือการยกเลิกการเรียกพารามิเตอร์นั้นไม่ได้ทำให้เกิดกระบวนการย่อย ...
jasonwryan

@ jasonwryan คุณช่วยอธิบายการทำงานของ * ในสองตัวอย่างข้างต้นได้ไหม? หรือทำไมเราต้องใส่ * โดยเฉพาะอย่างยิ่งในตัวอย่างแรก * ถูกวางไว้ก่อน //; ในขณะที่ในตัวอย่างที่สอง * ถูกวางไว้หลัง / ความแตกต่างพื้นฐานคืออะไร? ขอบคุณ
user785099

3
glob ( *) ระบุว่าทุกอย่างจนถึงและรวมถึงรูปแบบจะถูกลบ ดังนั้นสำหรับการเริ่มต้นของพารามิเตอร์#มันอยู่ทางซ้ายและสิ้นสุด%การทำงานวิธีอื่นจากทางขวา
jasonwryan

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