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"*
เป็นรูปแบบ (สำหรับการเปรียบเทียบสตริง)