file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Sử dụng case ... esaclà một trong những cách đơn giản nhất để thực hiện khớp mẫu theo cách di động. Nó hoạt động như một "công tắc" tuyên bố trong các ngôn ngữ khác ( bash, zshvà ksh93cũng cho phép bạn làm rơi qua theo những cách không tương thích khác nhau). Các mẫu được sử dụng là các mẫu Globing tên tệp tiêu chuẩn.
Vấn đề bạn gặp phải là do thực tế đó _là một ký tự hợp lệ trong một tên biến. Do đó, shell sẽ xem *_$testseq_*là " *_theo sau là giá trị của biến $testseq_và *". Biến $testseq_không được xác định, vì vậy nó sẽ được mở rộng thành một chuỗi rỗng và bạn kết thúc bằng *_*, rõ ràng phù hợp với $filegiá trị mà bạn có. Bạn có thể mong đợi nhận được Truemiễn là tên tệp trong $filechứa ít nhất một dấu gạch dưới.
Để phân định chính xác tên của biến, sử dụng "..."xung quanh việc mở rộng : *_"$testseq"_*. Điều này sẽ sử dụng giá trị của biến như một chuỗi. Bạn có muốn sử dụng giá trị của biến làm mẫu , *_${testseq}_*thay vào đó hãy sử dụng .
Một cách khắc phục nhanh khác là bao gồm các dấu gạch dưới trong giá trị của $testseq:
testseq="_gen_"
và sau đó chỉ sử dụng *"$testseq"*làm mẫu (để so sánh chuỗi).