Bedingter Regex-Fehler

14
string=123456

if [ $string == 123456 ]; then
echo 123
fi

Das funktioniert gut, aber wenn ich == zu = ~ wechsle, bekomme ich folgenden Fehler:

./test: line 3: [: =~: binary operator expected
Lumify
quelle
Die Verwendung von =~ist in diesem Fall falsch. =~vergleicht das Muster (linke Seite der Aufgabe) mit einem regulären Ausdruck regexauf der rechten Seite des Assinments. Ein regulärer Ausdruck in seiner einfachsten Form wird übergeben wie'[0-9][0-9]'
Valentin Bajrami
8
@ val0x00ff ist aber 123456eine gültige RE
roaima 22.10.17
@roaima stimmte zu, aber Regex ist bekannt für seine Engine, Rückverweise, Zeichensätze, Meta-Zeichen, die den Beginn einer Zeichenfolge, das Ende einer Zeichenfolge usw. bezeichnen.
Valentin Bajrami

Antworten:

27

Bash ‚s Regex Matching funktioniert nur in doppelten eckigen Klammern[[ ... ]]:

string=123456
if [[ "$string" =~ 123456 ]]; then echo 123; fi
123
RomanPerekhrest
quelle
@Kusalananda: In Bezug auf die Bearbeitung sind die Anführungszeichen auf der linken Seite eines Ausdrucks in doppelten Klammern nicht erforderlich [[ ... ]], da dort keine Wortteilung oder Pfadnamenerweiterung erfolgt. Sie werden nur benötigt, wenn einzelne Klammern [ ... ](auf beiden Seiten) und rechts von der doppelten Klammer verwendet werden.
user000001
@ user000001 Wenn Sie korrekt sind, ist es viel besser, alle Variablen durch Reflex zu zitieren, es sei denn, es besteht die Notwendigkeit, dies nicht zu tun. Es ist eine viel sicherere Angewohnheit.
Joe
@Joe: Im Zweifelsfall einverstanden, Zitat ... Ich habe dies nur erwähnt, weil es sich um eine Bearbeitung einer bereits richtigen Antwort handelte. Wäre es von der ersten Überarbeitung an dabei gewesen, hätte ich dies nicht kommentiert.
user000001