Le code suivant
number=1
if [[ $number =~ [0-9] ]]
then
echo matched
fi
travaux. Cependant, si j'essaie d'utiliser des guillemets dans l'expression régulière, cela s'arrête:
number=1
if [[ $number =~ "[0-9]" ]]
then
echo matched
fi
J'ai essayé "\[0-9\]"
, aussi. Qu'est-ce que je rate?
Curieusement, bash advanced scripting guide suggère que cela devrait fonctionner.
Bash version 3.2.39.
Il a été changé entre 3.1 et 3.2 . Je suppose que le guide avancé a besoin d'une mise à jour.
Il s'agit d'une description concise des nouvelles fonctionnalités ajoutées à bash-3.2 depuis la sortie de bash-3.1. Comme toujours, la page de manuel (doc/bash.1) est l'endroit idéal pour rechercher des descriptions complètes.
- Nouvelles fonctionnalités de Bash
couper
f. La citation de l'argument chaîne à l'opérateur [[command's = ~ force désormais la correspondance des chaînes, comme avec les autres opérateurs de correspondance de modèle.
Malheureusement, cela rompra la citation existante à l'aide de scripts, sauf si vous avez eu la perspicacité de stocker des modèles dans des variables et de les utiliser à la place des expressions régulières directement. Exemple ci-dessous.
$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
$ if [[ $number =~ [0-9] ]]; then echo match; fi
match
$ re="[0-9]"
$ if [[ $number =~ $re ]]; then echo MATCH; fi
MATCH
$ bash --version
GNU bash, version 3.00.0(1)-release (i586-suse-linux)
Copyright (C) 2004 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
match
$ if [[ "$number" =~ [0-9] ]]; then echo match; fi
match
Bash 3.2 a introduit une option de compatibilité compat31 qui ramène le comportement de citation des expressions régulières bash à 3.1
Sans compat31:
$ shopt -u compat31
$ shopt compat31
compat31 off
$ set -x
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ \[0-9] ]]
+ echo no match
no match
Avec compat31:
$ shopt -s compat31
+ shopt -s compat31
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ [0-9] ]]
+ echo match
match
Lien vers le patch: http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-039
GNU bash, version 4.2.25 (1) -release (x86_64-pc-linux-gnu)
Quelques exemples de correspondance de chaîne et de correspondance d'expression régulière
$ if [[ 234 =~ "[0-9]" ]]; then echo matches; fi # string match
$
$ if [[ 234 =~ [0-9] ]]; then echo matches; fi # regex natch
matches
$ var="[0-9]"
$ if [[ 234 =~ $var ]]; then echo matches; fi # regex match
matches
$ if [[ 234 =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9]
$ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9]
$ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # regex match after substituting $var as [0-9]
matches
$ if [[ "rss\$var919" =~ "$var" ]]; then echo matches; fi # string match won't work
$ if [[ "rss\\$var919" =~ "$var" ]]; then echo matches; fi # string match won't work
$ if [[ "rss'$var'""919" =~ "$var" ]]; then echo matches; fi # $var is substituted on LHS & RHS and then string match happens
matches
$ if [[ 'rss$var919' =~ "\$var" ]]; then echo matches; fi # string match !
matches
$ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match failed
$
$ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match
matches
$ echo $var
[0-9]
$
$ if [[ abc123def =~ "[0-9]" ]]; then echo matches; fi
$ if [[ abc123def =~ [0-9] ]]; then echo matches; fi
matches
$ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match due to single quotes on RHS $var matches $var
matches
$ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # Regex match
matches
$ if [[ 'rss$var' =~ $var ]]; then echo matches; fi # Above e.g. really is regex match and not string match
$
$ if [[ 'rss$var919[0-9]' =~ "$var" ]]; then echo matches; fi # string match RHS substituted and then matched
matches
$ if [[ 'rss$var919' =~ "'$var'" ]]; then echo matches; fi # trying to string match '$var' fails
$ if [[ '$var' =~ "'$var'" ]]; then echo matches; fi # string match still fails as single quotes are omitted on RHS
$ if [[ \'$var\' =~ "'$var'" ]]; then echo matches; fi # this string match works as single quotes are included now on RHS
matches
Comme mentionné dans d'autres réponses, placer l'expression régulière dans une variable est un moyen général de réaliser la compatibilité entre différentes versions bash . Vous pouvez également utiliser cette solution de contournement pour obtenir la même chose, tout en conservant votre expression régulière dans l'expression conditionnelle:
$ number=1
$ if [[ $number =~ $(echo "[0-9]") ]]; then echo matched; fi
matched
$