web-dev-qa-db-fra.com

Test Bash: que fait "= ~"?

#!/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

Qu'est-ce que le leader ~ faire dans l'expression régulière de départ?

45
ragnarok

Le ~ fait en fait partie de l'opérateur =~ qui effectue une correspondance d'expression régulière de la chaîne à sa gauche avec l'expression régulière étendue à sa droite.

[[ "string" =~ pattern ]]

Notez que la chaîne doit être entre guillemets et que l'expression régulière ne doit pas être entre guillemets.

Un opérateur similaire est utilisé dans le langage de programmation Perl.

Les expressions régulières comprises par bash sont les mêmes que celles que GNU grep comprend avec le -E flag, c'est-à-dire l'ensemble étendu d'expressions régulières.


Un peu hors sujet, mais bon à savoir:

Lors de la correspondance avec une expression régulière contenant des groupes de capture, la partie de la chaîne capturée par chaque groupe est disponible dans le BASH_REMATCH tableau. Le zéro/la première entrée de ce tableau correspond à & dans le modèle de remplacement de la commande de substitution de sed (ou $& en Perl), qui est le bit de la chaîne qui correspond au modèle, tandis que les entrées à l'index 1 et supérieur correspondent à \1, \2, etc. dans un modèle de remplacement sed (ou $1, $2 etc. en Perl), c'est-à-dire les bits correspondant à chaque parenthèse.

Exemple:

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

Cela peut produire

Got 09, 19 and 14

si l'heure actuelle se trouve être 09:19:14.

Le bit REMATCH du BASH_REMATCH le nom du tableau provient de "Regular Expression Match", c'est-à-dire "RE-Match".


Dans les shells non -bash de type Bourne, on peut également utiliser expr pour une correspondance limitée d'expressions régulières (en utilisant uniquement des expressions régulières de base).

Un petit exemple:

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

Vous devriez lire les pages de manuel bash, sous la section [[ expression ]].

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)).

Pour faire court, =~ Est un opérateur, tout comme == Et !=. Cela n'a rien à voir avec l'expression rationnelle réelle dans la chaîne à sa droite.

4
Sokel