(3 réponses)
Fermé il y a 3 ans.
Alors pourquoi ce qui suit fonctionne-t-il, c'est-à-dire imprime le match :
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
Mais ce qui suit ne le fait PAS :
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
Quelle est la différence? C'est la même regex
Réponse acceptée :
N'utilisez pas les guillemets simples à l'intérieur de [[
:
if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
echo "Match!"
fi
Du manuel GNU bash :https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs
Notez en particulier :
Toute partie du modèle peut être entre guillemets pour forcer la partie entre guillemets à correspondre à une chaîne .
Le manuel semble suggérer d'utiliser la variable est préférable :
Le stockage de l'expression régulière dans une variable de shell est souvent un moyen utile d'éviter les problèmes liés à la citation de caractères spéciaux pour le shell. Il est parfois difficile de spécifier littéralement une expression régulière sans utiliser de guillemets, ou de garder une trace des guillemets utilisés par les expressions régulières tout en faisant attention à la suppression des guillemets du shell. L'utilisation d'une variable shell pour stocker le modèle réduit ces problèmes.