file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
การใช้case ... esacเป็นหนึ่งในวิธีที่ง่ายที่สุดในการจับคู่รูปแบบในแบบพกพา การทำงานเป็น "เปลี่ยน" คำสั่งในภาษาอื่น ๆ ( bash, zshและksh93ยังช่วยให้คุณทำในฤดูใบไม้ร่วงผ่านในรูปแบบที่เข้ากันไม่ได้ต่างๆ) รูปแบบที่ใช้เป็นรูปแบบชื่อไฟล์มาตรฐานการวนรอบ
ปัญหาที่คุณพบนั้นเกิดจากความจริงที่ว่า_เป็นอักขระที่ถูกต้องในชื่อตัวแปร เชลล์จะมอง*_$testseq_*ว่า " *_ตามด้วยค่าของตัวแปร$testseq_และ*" ตัวแปร$testseq_ไม่ได้ถูกกำหนดดังนั้นมันจะถูกขยายเป็นสตริงว่างเปล่าและคุณก็จบลงด้วย*_*ซึ่งตรงกับ$fileค่าที่คุณมี คุณอาจคาดหวังว่าจะได้รับTrueตราบใดที่ชื่อไฟล์$fileมีเครื่องหมายขีดล่างอย่างน้อยหนึ่งรายการ
ที่จะต้องคั่นชื่อของตัวแปรที่ใช้รอบการขยายตัว:"..." *_"$testseq"_*สิ่งนี้จะใช้ค่าของตัวแปรเป็นสตริง คุณต้องการใช้ค่าของตัวแปรเป็นรูปแบบหรือไม่ใช้*_${testseq}_*แทน
อีกหนึ่งการแก้ไขด่วนคือการรวมขีดล่างในค่าของ$testseq:
testseq="_gen_"
จากนั้นใช้*"$testseq"*เป็นรูปแบบ (สำหรับการเปรียบเทียบสตริง)