file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Die Verwendung case ... esacist eine der einfachsten Methoden, um einen Mustervergleich auf tragbare Weise durchzuführen. Es funktioniert wie eine „switch“ Anweisung in anderen Sprachen ( bash, zsh, und ksh93können Sie auch tun , Durchfall in verschiedener inkompatible Weise). Die verwendeten Muster sind die Globbing-Muster für Standarddateinamen.
Das Problem, das Sie haben, ist auf die Tatsache zurückzuführen, dass _es sich bei einem Variablennamen um ein gültiges Zeichen handelt. Die Shell wird daher *_$testseq_*als " *_gefolgt von dem Wert der Variablen $testseq_und einem *" angezeigt . Die Variable $testseq_ist undefiniert, daher wird sie zu einer leeren Zeichenfolge erweitert, und am Ende erhalten Sie eine *_*, die offensichtlich mit dem von $fileIhnen angegebenen Wert übereinstimmt. Sie können erwarten, Truesolange der Dateiname $filemindestens einen Unterstrich enthält.
Um richtig den Namen der Variablen, die Verwendung zu begrenzen "..."um die Erweiterung: *_"$testseq"_*. Dies würde den Wert der Variablen als Zeichenfolge verwenden. Möchten Sie den Wert der Variablen als Muster verwenden , verwenden Sie *_${testseq}_*stattdessen.
Eine weitere schnelle Lösung besteht darin, die Unterstriche in den Wert von einzuschließen $testseq:
testseq="_gen_"
und dann einfach *"$testseq"*als Muster verwenden (für einen Zeichenkettenvergleich).