file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Usar case ... esaces una de las formas más sencillas de realizar una coincidencia de patrones de forma portátil. Funciona como una declaración "switch" en otros idiomas ( bash, zshy ksh93también le permite hacer caer a través de varias formas incompatibles). Los patrones utilizados son los patrones estándar de nombres de archivo.
El problema que tiene se debe al hecho de que _es un carácter válido en un nombre de variable. El shell se verá así *_$testseq_*como " *_seguido por el valor de la variable $testseq_y un *". La variable $testseq_no está definida, por lo que se expandirá a una cadena vacía y terminará con *_*, que obviamente coincide con el $filevalor que tiene. Puede esperar obtener Truesiempre que el nombre de archivo $filecontenga al menos un guión bajo.
Para delimitar correctamente el nombre de la variable, el uso "..."alrededor de la expansión: *_"$testseq"_*. Esto usaría el valor de la variable como una cadena. Si desea utilizar el valor de la variable como patrón , utilice *_${testseq}_*en su lugar.
Otra solución rápida es incluir los guiones bajos en el valor de $testseq:
testseq="_gen_"
y luego simplemente usar *"$testseq"*como patrón (para una comparación de cadenas).