file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Usar case ... esacé uma das maneiras mais simples de executar uma correspondência de padrões de maneira portátil. Ele funciona como uma declaração de "switch" em outros idiomas ( bash, zshe ksh93também permite que você faça queda-through de várias maneiras incompatíveis). Os padrões usados são os padrões de globbing do nome do arquivo padrão.
O problema que você está enfrentando se deve ao fato de _ser um caractere válido em um nome de variável. O shell será visto *_$testseq_*como " *_seguido pelo valor da variável $testseq_e um *". A variável $testseq_é indefinida, portanto ela será expandida para uma sequência vazia e você terminará com *_*, o que obviamente corresponde ao $filevalor que você possui. Você pode esperar obter Trueo nome do nome do arquivo $filecontido em pelo menos um sublinhado.
Para delimitar corretamente o nome da variável, o uso "..."em torno da expansão: *_"$testseq"_*. Isso usaria o valor da variável como uma sequência. Deseja usar o valor da variável como um padrão , use em *_${testseq}_*vez disso.
Outra solução rápida é incluir os sublinhados no valor de $testseq:
testseq="_gen_"
e use apenas *"$testseq"*como padrão (para uma comparação de cadeias).