Schauen Sie sich diesen if-Block an:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Dies sollte "übereinstimmend" drucken, tut es aber nicht. Wo gehe ich falsch?
Schauen Sie sich diesen if-Block an:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Dies sollte "übereinstimmend" drucken, tut es aber nicht. Wo gehe ich falsch?
Antworten:
Sie müssen das Zitat in der Regex-Übereinstimmung entfernen.
if [[ ${str} =~ m\.m ]]; then
Von der Bash-Manpage:
[...] Ein zusätzlicher binärer Operator = ~ ist verfügbar, mit der gleichen Priorität wie == und! =. Bei Verwendung wird die Zeichenfolge rechts vom Operator als erweiterter regulärer Ausdruck betrachtet und entsprechend angepasst (wie in Regex (3)). Der Rückgabewert ist 0, wenn die Zeichenfolge mit dem Muster übereinstimmt, andernfalls 1. Wenn der reguläre Ausdruck syntaktisch falsch ist, beträgt der Rückgabewert des bedingten Ausdrucks 2. Wenn die Shell-Option nocasematch aktiviert ist, wird die Übereinstimmung ohne Berücksichtigung des Falls von alphabetischen Zeichen durchgeführt. Jeder Teil des Musters kann in Anführungszeichen gesetzt werden, um zu erzwingen, dass es als Zeichenfolge abgeglichen wird.
Bei den Anführungszeichen verwenden Sie also einen guten alten String-Abgleich.
Wenn Sie Leerzeichen im Muster benötigen, maskieren Sie diese einfach:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
sollte ich verwenden oder sollte ich verwenden ${str} =~ needle[0-9]{1}
?