GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le Regex dans Bash ne fonctionne-t-il que s'il s'agit d'une variable et pas directement ? ?

Cette question a déjà des réponses ici :shell teste si la chaîne de plusieurs lignes contient le motif spécifié dans la dernière ligne

(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.


Linux
  1. Pourquoi l'expression régulière fonctionne-t-elle dans X mais pas dans Y ?

  2. La différence entre une commande intégrée et une qui ne l'est pas ?

  3. Pourquoi [a-z] correspond-il aux lettres minuscules dans Bash ?

  4. Pourquoi le parent Shell Here-document ne fonctionne pas pour la sous-commande dans Dash mais Bash fonctionne?

  5. Pourquoi /bin/sh pointe-t-il vers /bin/dash et non /bin/bash ? ?

Pourquoi le fichier de traduction Bash ne contient-il pas tous les textes d'erreur ?

La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

Portée variable pour les scripts shell bash et les fonctions dans le script

Quelle est la différence entre &> et >&en bash ?

Pourquoi Ctrl + V ne colle-t-il pas dans Bash (shell Linux) ?

Pourquoi cette regex ne fonctionne-t-elle pas sous Linux ?