file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Die Verwendung case ... esac
ist eine der einfachsten Methoden, um einen Mustervergleich auf tragbare Weise durchzuführen. Es funktioniert wie eine „switch“ Anweisung in anderen Sprachen ( bash
, zsh
, und ksh93
kö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 $file
Ihnen angegebenen Wert übereinstimmt. Sie können erwarten, True
solange der Dateiname $file
mindestens 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).