ผมอยากจะบอกว่าสตริงจะตรงตามรูปแบบ $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}จะขยายตัวมากในช่วงต้นเข้าสู่การขัดแย้งหลายและbarbaz