ฉันค่อนข้างสับสนเกี่ยวกับการแสดงออกปกติต่อไปนี้ที่ฉันพบในเชลล์สคริปต์
${0##*/}
${0%/*}
พวกเขาทำงานอย่างไร
ฉันค่อนข้างสับสนเกี่ยวกับการแสดงออกปกติต่อไปนี้ที่ฉันพบในเชลล์สคริปต์
${0##*/}
${0%/*}
พวกเขาทำงานอย่างไร
คำตอบ:
สิ่งเหล่านี้ไม่ใช่นิพจน์ทั่วไปเป็นตัวอย่างของการขยายพารามิเตอร์ของ Bash: การแทนที่ของตัวแปรหรือพารามิเตอร์พิเศษด้วยค่าของมัน Wooledge วิกิพีเดียมีคำอธิบายที่ดี
โดยทั่วไปในตัวอย่างที่คุณมี${0##*/}
แปลว่า:
สำหรับตัวแปร $ 0 และรูปแบบ '/' แฮชสองค่าเฉลี่ยจากจุดเริ่มต้นของพารามิเตอร์ลบการจับคู่ที่ยาวที่สุด (หรือโลภ) - จนถึงและรวมถึงรูปแบบ
ดังนั้นที่ไหน$0
คือชื่อของไฟล์เช่น. $HOME/documents/doc.txt
, จากนั้นพารามิเตอร์จะถูกขยายเป็น:doc.txt
ในทำนองเดียวกันสำหรับ${0%/*}
รูปแบบ/
จะถูกจับคู่กับจุดสิ้นสุดของพารามิเตอร์ (คน%
) กับการแข่งขันที่สั้นที่สุดหรือไม่โลภลบ - $HOME/documents
ซึ่งในตัวอย่างข้างต้นจะให้คุณ
ดูเพิ่มเติมบทความบนHacker ทุบตีของวิกิพีเดีย
*
) ระบุว่าทุกอย่างจนถึงและรวมถึงรูปแบบจะถูกลบ ดังนั้นสำหรับการเริ่มต้นของพารามิเตอร์#
มันอยู่ทางซ้ายและสิ้นสุด%
การทำงานวิธีอื่นจากทางขวา
sh
POSIX
basename
และdirname
? : D