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
, zsh
e ksh93
també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 $file
valor que você possui. Você pode esperar obter True
o nome do nome do arquivo $file
contido 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).