it-swarm.com.de

Bash-Test: Was macht "= ~"?

#!/bin/bash
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

echo "INT is an integer."

else

echo "INT is not an integer." >&2

exit 1

fi

Was macht der führende ~ im regulären Anfangsausdruck tun?

45
ragnarok

Das ~ ist tatsächlich Teil des Operators =~, der eine Übereinstimmung des Strings mit regulären Ausdrücken links von ihm mit dem erweiterten regulären Ausdruck rechts von ihm ausführt.

[[ "string" =~ pattern ]]

Beachten Sie, dass die Zeichenfolge in Anführungszeichen gesetzt werden sollte und dass der reguläre Ausdruck nicht in Anführungszeichen gesetzt werden sollte.

Ein ähnlicher Operator wird in der Programmiersprache Perl verwendet.

Die regulären Ausdrücke, die von bash verstanden werden, sind die gleichen wie diejenigen, die GNU grep mit dem Flag -E versteht, dh die erweiterte Menge regulärer Ausdrücke .


Etwas abseits des Themas, aber gut zu wissen:

Beim Abgleich mit einem regulären Ausdruck, der Erfassungsgruppen enthält, ist der von jeder Gruppe erfasste Teil der Zeichenfolge im Array BASH_REMATCH verfügbar. Der nullte/erste Eintrag in diesem Array entspricht & im Ersetzungsmuster des Substitutionsbefehls von sed (oder $& in Perl), dem Bit des Strings, das dem Muster entspricht , während die Einträge ab Index 1 \1, \2 usw. in einem sed Ersatzmuster (oder $1, $2 usw. entsprechen. in Perl), dh die Bits, die mit jeder Klammer übereinstimmen.

Beispiel:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

Dies kann ausgegeben werden

Got 09, 19 and 14

wenn die aktuelle Zeit zufällig 09:19:14 ist.

Das REMATCH -Bit des Array-Namens BASH_REMATCH stammt von "Regular Expression Match", d. H. "RE-Match".


In nicht -bash Bourne-ähnlichen Shells kann man auch expr für den eingeschränkten Abgleich regulärer Ausdrücke verwenden (wobei nur grundlegende reguläre Ausdrücke verwendet werden).

Ein kleines Beispiel:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
52
Kusalananda

Sie sollten die Bash-Manpages im Abschnitt [[ expression ]] Lesen.

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

Kurz gesagt, =~ Ist ein Operator, genau wie == Und !=. Es hat nichts mit dem tatsächlichen regulären Ausdruck in der Zeichenfolge rechts davon zu tun.

4
Sokel