file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Menggunakan case ... esac
adalah salah satu cara paling sederhana untuk melakukan pencocokan pola dengan cara portabel. Ia bekerja sebagai "switch" pernyataan dalam bahasa lain ( bash
, zsh
, dan ksh93
juga 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 $file
nilai yang Anda miliki. Anda mungkin berharap mendapatkan True
selama nama file dalam $file
mengandung 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).