file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Использование case ... esac- это один из самых простых способов выполнить сопоставление с образцом переносимым способом. Он работает как оператор «switch» на других языках ( bash, zshи ksh93также позволяет выполнять сквозные операции различными несовместимыми способами). Используемые шаблоны являются стандартными шаблонами подстановки имен файлов.
Проблема, с которой вы столкнулись, связана с тем, что _это допустимый символ в имени переменной. Оболочка, таким образом, будет выглядеть *_$testseq_*как « *_сопровождаемая значением переменной $testseq_и an *». Переменная $testseq_не определена, поэтому она будет расширена до пустой строки, и вы в итоге получите *_*, что, очевидно, соответствует $fileзначению, которое у вас есть. Вы можете рассчитывать получить Trueдо тех пор, пока имя файла $fileсодержит хотя бы одно подчеркивание.
Для того, чтобы правильно разграничить имя переменной, использование "..."вокруг расширения: *_"$testseq"_*. Это будет использовать значение переменной в виде строки. Если вы хотите использовать значение переменной в качестве шаблона , используйте *_${testseq}_*вместо этого.
Еще одно быстрое решение - включить подчеркивание в значение $testseq:
testseq="_gen_"
а затем просто использовать *"$testseq"*в качестве шаблона (для сравнения строк).