Erreur d'expression régulière de condition

14
string=123456

if [ $string == 123456 ]; then
echo 123
fi

Cela fonctionne bien, mais si je change == en = ~ j'obtiens cette erreur:

./test: line 3: [: =~: binary operator expected
Lumify
la source
Dans =~ce cas, l' utilisation de est incorrecte. =~compare le bagout (côté gauche de la tâche) avec une expression régulière regexsur le côté droit de l'assinment. Une expression régulière dans sa forme la plus simple est passée comme'[0-9][0-9]'
Valentin Bajrami
9
@ val0x00ff mais 123456est une RE valide
roaima
@roaima a accepté, mais regex est connu pour son moteur, son référencement, son jeu de caractères, ses méta-caractères indiquant le début d'une chaîne, la fin d'une chaîne, etc.
Valentin Bajrami

Réponses:

28

Lacorrespondance des expressions rationnelles de Bash fonctionne uniquement entre crochets doubles[[ ... ]]:

string=123456
if [[ "$string" =~ 123456 ]]; then echo 123; fi
123
RomanPerekhrest
la source
@Kusalananda: En ce qui concerne la modification, les guillemets ne sont pas requis sur le côté gauche d'une expression à double crochet [[ ... ]], car aucun fractionnement de mot ou expansion de chemin ne s'y produit. Ils ne sont nécessaires que lors de l'utilisation de crochets simples [ ... ](des deux côtés) et à droite de l'expression de double crochet.
user000001
@ user000001 tant que vous avez raison, il est préférable de simplement citer toutes les variables par réflexe, sauf s'il est nécessaire de ne pas le faire. C'est une habitude beaucoup plus sûre.
Joe
@Joe: D'accord, en cas de doute, citez ... Je ne l'ai mentionné que parce qu'il s'agissait d'une modification d'une réponse déjà correcte. S'il avait été là dès la première révision, je n'aurais pas commenté cela.
user000001