Ich habe den Code
file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
echo "True"
else
echo "False"
fi
Ich teste ob file
"gen" enthalten ist. Die Ausgabe ist "False". Nett!
Das Problem ist, wenn ich "gen" durch eine Variable ersetze testseq
:
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
echo "True"
else
echo "False"
fi
Jetzt ist die Ausgabe "True". Wie könnte es sein? Wie kann das Problem behoben werden?
shell-script
variable
string
control-flow
Viesturs
quelle
quelle
Antworten:
Sie müssen die
$testseq
Variable auf eine der folgenden Arten interpolieren :$file == *_"$testseq"_*
(hier$testseq
als feste Zeichenfolge betrachtet)$file == *_${testseq}_*
(hier$testseq
als Muster angesehen).Oder der
_
Name unmittelbar nach der Variablen wird als Teil des Variablennamens verwendet (es ist ein gültiges Zeichen in einem Variablennamen).quelle
Verwenden Sie den
=~
Operator, um Vergleiche mit regulären Ausdrücken durchzuführen:Auf diese Weise wird es vergleichen , wenn
$file
hat$testseq
seinen Inhalt auf.Wenn ich mich ändere
testseq="Const"
:Aber seien Sie vorsichtig mit dem, was Sie füttern
$testseq
. Wenn die Zeichenfolge darauf irgendwie einen regulären Ausdruck darstellt (wie[0-9]
zum Beispiel), besteht eine größere Chance, eine "Übereinstimmung" auszulösen.Referenz :
quelle
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
, undksh93
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
:und dann einfach
*"$testseq"*
als Muster verwenden (für einen Zeichenkettenvergleich).quelle
*"$testseq"*
fürcase
wie für[[...]]
(außer zsh es sei denn , Sie aktivieren globsubst)