J'essaie de déterminer si une chaîne contient une expression régulière dans shell ( bash
).
Plus précisément, s'il contient un chiffre.
Et pendant que ça:
$ [[ string_with[6]indice =~ [0-9] ]] && echo "True" || echo "False"
fonctionne comme prévu. Lorsque j'assigne des variables LHS et RHS, il se passe quelque chose d'étrange:
$ STR=string_with[6]indice
$ REGEX=[0-9]
$ [[ string_with[6]indice =~ [0-9] ]] && echo "True" || echo "False"
False
Je voulais voir à quoi le shell dépensait mes variables et ai découvert ceci:
$ STR=string_with[6]indice
+ STR='string_with[6]indice'
$ REGEX=[0-9]
+ REGEX='[0-9]'
$ [[ $STR =~ "$REGEX" ]] && echo "True" || echo "False"
+ [[ string_with[6]indice =~ \[0-9] ]]
+ echo False
False
Où cette \
devant [0-9]
provenir, et pourquoi la coquille échapper automatiquement la première tranche [
en REGEX
?
$STR
ou non (à moins qu'il y ait un blanc incorporé), mais citer$REGEX
donne ce que vous observez, tout en omettant les guillemets. La double citation du modèle de recherche littérale se comporte de la même manière. J'imagine qu'il y aura des problèmes s'il y a un nom de fichier à un chiffre dans le répertoire actuel. Je voudrais citer entre les deux affectations variables pour éviter cela.Réponses:
C'est parce que vous avez des guillemets doubles
$REGEX
. Lors de la mise en correspondance avec l'=~
opérateur, les sections citées du motif sont traitées littéralement. C'est-à-dire que les méta-caractères regex dans les sections citées sont traités comme s'ils avaient été échappés. Comparez l'effet lorsque le motif est entre guillemets:avec l'effet sans guillemets:
C'est l'un des rares cas où vous ne souhaitez pas citer une référence de variable.
BTW, je recommande l'utilisation de noms de variables en minuscules ou en majuscules dans les scripts shell; De cette façon, vous ne courez pas le risque d'entrer en conflit avec une variable d'environnement qui a une signification particulière pour le shell ou d'autres programmes (
$PATH
c'est l'exemple classique).la source