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