file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Menggunakan case ... esacadalah salah satu cara paling sederhana untuk melakukan pencocokan pola dengan cara portabel. Ia bekerja sebagai "switch" pernyataan dalam bahasa lain ( bash, zsh, dan ksh93juga memungkinkan Anda untuk melakukan jatuh-melalui berbagai cara yang tidak kompatibel). Pola yang digunakan adalah pola globbing nama file standar.
Masalah yang Anda hadapi disebabkan oleh fakta bahwa _karakter yang valid dalam nama variabel. Shell dengan demikian akan melihat *_$testseq_*" *_diikuti oleh nilai variabel $testseq_dan *". Variabel $testseq_tidak terdefinisi, sehingga akan diperluas ke string kosong, dan Anda berakhir dengan *_*, yang jelas cocok dengan $filenilai yang Anda miliki. Anda mungkin berharap mendapatkan Trueselama nama file dalam $filemengandung setidaknya satu garis bawah.
Untuk benar membatasi nama variabel, penggunaan "..."sekitar ekspansi: *_"$testseq"_*. Ini akan menggunakan nilai variabel sebagai string. Jika Anda ingin menggunakan nilai variabel sebagai pola , gunakan *_${testseq}_*saja.
Perbaikan cepat lainnya adalah dengan memasukkan garis bawah dalam nilai $testseq:
testseq="_gen_"
dan kemudian gunakan saja *"$testseq"*sebagai pola (untuk perbandingan string).