Você precisa interpolar a variável $testseq com uma das seguintes formas:
-
$file == *_"$testseq"_*(aqui$testseqconsiderado como uma string fixa) -
$file == *_${testseq}_*(aqui$testseqconsiderado como um padrão).
Eu tenho o código
file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
echo "True"
else
echo "False"
fi
Eu testo se file contém "gen". A saída é "False". Nice!
O problema é quando eu substituo "gen" por uma variável testseq :
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
echo "True"
else
echo "False"
fi
Agora a saída é "True". Como isso poderia ser? Como consertar o problema?
Use o operador =~ para fazer comparações regulares de expressão:
#!/bin/bash
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file =~ $testseq ]];
then
echo "True"
else
echo "False"
fi
Desta forma, irá comparar se $file tem $testseq no seu conteúdo.
user@host:~$ ./string.sh
False
Se eu alterar testseq="Const" :
user@host:~$ ./string.sh
True
Mas, tenha cuidado com o que você alimenta $testseq com. Se a string nela representar uma regex (como [0-9] , por exemplo), há mais chance de acionar uma "correspondência".
Referência :
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ão de maneira portátil. Ele funciona como uma instrução "switch" em outros idiomas ( bash e ksh93 também permite que você faça fall-through de várias maneiras). Os padrões utilizados são os padrões de globbing do nome de arquivo padrão.
O problema que você está tendo é devido ao fato de que _ é um caractere válido em um nome de variável. O shell verá *_$testseq_* como " *_ seguido pelo valor da variável $testseq_ e * ". A variável $testseq_ é indefinida, então será expandida para uma string vazia, e você acaba com *_* , que obviamente corresponde. Portanto, você pode esperar obter True , desde que o nome do arquivo em $file contenha pelo menos um sublinhado.
Para delimitar adequadamente o nome da variável, use {...} em torno de seu nome: *_${testseq}_* .
Outra solução rápida é incluir os sublinhados no valor de $testseq :
testseq="_gen_"
e, em seguida, use apenas *$testseq* como padrão.