Regardez ce bloc si:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Cela devrait imprimer "correspondant", mais ce n'est pas le cas. Où vais-je mal?
Regardez ce bloc si:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Cela devrait imprimer "correspondant", mais ce n'est pas le cas. Où vais-je mal?
Réponses:
Vous devez supprimer la citation dans la correspondance d'expression régulière.
if [[ ${str} =~ m\.m ]]; then
Depuis la page de manuel de bash:
[...] Un opérateur binaire supplémentaire, = ~, est disponible, avec la même priorité que == et! =. Lorsqu'elle est utilisée, la chaîne à droite de l'opérateur est considérée comme une expression régulière étendue et correspond en conséquence (comme dans regex (3)). La valeur de retour est 0 si la chaîne correspond au modèle et 1 sinon. Si l'expression régulière est syntaxiquement incorrecte, la valeur de retour de l'expression conditionnelle est 2. Si l'option shell nocasematch est activée, la correspondance est effectuée sans tenir compte de la casse des caractères alphabétiques. N'importe quelle partie du modèle peut être citée pour forcer sa correspondance sous forme de chaîne.
Donc, avec les guillemets, vous utilisez une bonne correspondance de chaînes.
Si vous avez besoin d'espaces dans le motif, échappez-leur simplement:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
dois-je utiliser ou dois-je utiliser ${str} =~ needle[0-9]{1}
?