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"*
в качестве шаблона (для сравнения строк).