file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Usar case ... esac
es 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
, zsh
y ksh93
tambié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 $file
valor que tiene. Puede esperar obtener True
siempre que el nombre de archivo $file
contenga 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).