ผมอยากจะบอกว่าสตริงจะตรงตามรูปแบบ $string
glob อาจหรืออาจไม่ใช่ชื่อของไฟล์ที่มีอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร$pattern
$string
สมมติรูปแบบต่อไปนี้สำหรับสตริงอินพุตของฉัน:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
ฉันต้องการที่จะหาสำนวนทุบตีที่กำหนดว่า$string
จะได้รับการจับคู่โดย$pattern1
, $pattern2
หรือรูปแบบ glob พลอื่น ๆ นี่คือสิ่งที่ฉันได้ลองไปแล้ว:
[[ "$string" = $pattern ]]
เกือบจะใช้งานได้ยกเว้นว่า
$pattern
ตีความเป็นรูปแบบสตริงและไม่เป็นรูปแบบแบบกลม[ "$string" = $pattern ]
ปัญหาด้วยวิธีนี้คือการที่
$pattern
มีการขยายและจากนั้นเปรียบเทียบสตริงจะดำเนินการระหว่างและการขยายตัวของ$string
$pattern
[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
อันนี้ใช้งานได้ แต่เฉพาะถ้า
$string
มีไฟล์ที่มีอยู่[[ $string =~ $pattern ]]
สิ่งนี้ไม่ทำงานเนื่องจาก
=~
โอเปอเรเตอร์ทำให้เกิด$pattern
การตีความว่าเป็นนิพจน์ปกติแบบขยายไม่ใช่รูปแบบแบบกลมหรือไวด์การ์ด
ls /foo/*
ตอนนี้คุณสามารถจับคู่ใน
foo/{bar,baz}
จริงๆแล้วคือการขยายรั้ง (ไม่ใช่การขยายพารามิเตอร์) ในขณะที่foo/*
การขยายชื่อพา ธ $string
เป็นการขยายพารามิเตอร์ สิ่งเหล่านี้ทำในเวลาที่ต่างกันและโดยกลไกที่แตกต่างกัน
case
คำสั่งดำเนินการขยายชื่อพา ธ ("globbing") ตามคู่มือ Bash
{bar,baz}
ไม่ใช่รูปแบบ มันคือการขยายพารามิเตอร์ แตกต่างที่ลึกซึ้ง แต่ที่สำคัญในการที่{bar,baz}
จะขยายตัวมากในช่วงต้นเข้าสู่การขัดแย้งหลายและbar
baz