Ceci est ma première création de scripts bash, donc je fais probablement une erreur facile.
Fondamentalement, j'essaie d'écrire un script qui obtient les groupes d'un utilisateur, et s'ils se trouvent dans un certain groupe, il enregistrera cela en conséquence. Évidemment, il y aura plus de fonctionnalités, mais cela ne sert à rien de dire que quand je ne peux même pas faire fonctionner l'expression régulière!
Jusqu'à présent, j'ai ceci:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Chaque endroit où j'ai essayé ce regex, ça marche. Mais dans le script bash, il ne produit que le $groups
, suivi de No match
. Alors, quelqu'un peut-il me dire ce qui ne va pas?
^([a-zA-Z0-9\-_]+)
puis ajoutez les deux points et ainsi de suite ... vous devriez découvrir très bientôt, où est le problème.Réponses:
De
man 7 regex
:Essayer l'expression rationnelle avec egrep donne une erreur:
Voici une version plus simple, qui donne également une erreur:
Puisque ce
\
n'est pas spécial, c'est une gamme, tout comme le[a-z]
serait. Vous devez mettre votre-
à la fin, comme[_-]
ou:Cela devrait fonctionner quelle que soit votre version de libc (dans egrep ou bash).
edit: Cela dépend également de vos paramètres régionaux. La page de manuel met en garde à ce sujet:
Par exemple:
Bien sûr, même s'il n'a pas commis d'erreur, il ne fait pas ce que vous voulez:
Il est une gamme qui en ASCII, comprend
\
,[
,^
et_
.la source
egrep
ne donne aucune erreur, il correspond juste correctement.LC_COLLATE="en_US.UTF-8"
:?-
...Règle générale avec les expressions rationnelles (et tous les bogues dans de plus gros morceaux de code): coupez-le et reconstruisez-le pas à pas ou utilisez la bissection - tout ce qui vous convient le mieux.
Dans ce cas, le coupable s'est avéré être le trait de soulignement - l'échapper avec une barre oblique inversée l'a fait fonctionner.
la source