Das hat nichts mit dem Shell-Schlüsselwort if zu tun, sondern betrifft das erweitere Test-Konstrukt [[ … ]] der Bash.
Dieses non-Posix-Feature kennt drei Muster-Vergleiche für Zeichenketten, ausgedrückt durch die Operatoren == (= ist dafür ein zulässiges Synonym), != (verschieden) und =~. Getestet wird jeweils, ob der konkrete Zeichenkette auf der linken Seite dem Muster auf der rechten Seite entspricht bzw. bei != nicht entspricht.
Als Muster erwarten die beiden ersten Operatoren ein Shell-Glob, der Operator =~ aber einen erweiterten regulären Ausdruck nach Posix.
Somit:
| $ a=1234 ; [[ $a =~ ^[0-9]{1,4}$ ]] ; echo $?
0
$ a=12345 ; [[ $a =~ ^[0-9]{1,4}$ ]] ; echo $?
1
$ a=12345 ; [[ $a =~ [0-9]{1,4}$ ]] ; echo $? # <-- aber
0
|
Beachte die Grundregel bei regulären Ausdrücken: Diese müssen in der Praxis immer verankert werden, i.d.F. sogar am Anfang und am Ende. Wenn man darauf verzichtet, funktionieren sie natürlich auch, aber in der Regel nicht der Aufgabe entsprechend.
Bearbeitet von rklm:
Syntaxhighlighting.