Dies ist mein erstes Bash-Scripting, daher mache ich wahrscheinlich einen leichten Fehler.
Grundsätzlich versuche ich, ein Skript zu schreiben, das die Gruppen eines Benutzers abruft, und wenn sie sich in einer bestimmten Gruppe befinden, wird dies entsprechend protokolliert. Offensichtlich wird es mehr Funktionalität geben, aber es hat keinen Sinn, etwas aufzubauen, wenn ich nicht einmal den regulären Ausdruck zum Laufen bringen kann!
Bisher habe ich Folgendes:
#!/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
Jeder Ort, an dem ich dieses Regex ausprobiert habe, funktioniert. Im Bash-Skript wird jedoch immer nur das ausgegeben $groups
, gefolgt von No match
. Kann mir jemand sagen, was daran falsch ist?
^([a-zA-Z0-9\-_]+)
fügen Sie dann den Doppelpunkt hinzu und so weiter ... Sie sollten ziemlich bald herausfinden, wo das Problem liegt.Antworten:
Von
man 7 regex
:Wenn Sie den regulären Ausdruck mit egrep versuchen, wird ein Fehler ausgegeben:
Hier ist eine einfachere Version, die auch einen Fehler gibt:
Da
\
ist nichts besonderes, das ist eine Reichweite, genau wie[a-z]
es sein würde. Sie müssen Ihre-
am Ende setzen, wie[_-]
oder:Dies sollte unabhängig von Ihrer libc-Version funktionieren (entweder in egrep oder bash).
Bearbeiten: Dies hängt auch von Ihren Ländereinstellungen ab. Die Manpage warnt davor:
Beispielsweise:
Natürlich macht es nicht das, was Sie wollen, obwohl es keinen Fehler gemacht hat:
Es ist ein Bereich, der in ASCII enthält
\
,[
,^
, und_
.quelle
egrep
gibt keinen Fehler, stimmt einfach richtig überein.LC_COLLATE="en_US.UTF-8"
:?-
...Allgemeine Regel bei regulären Ausdrücken (und allen Fehlern in größeren Codeteilen): Reduzieren Sie diese und erstellen Sie sie Schritt für Schritt neu oder verwenden Sie die Halbierung - was auch immer für Sie besser funktioniert.
In diesem Fall stellte sich heraus, dass der Schuldige der Unterstrich ist - ein Fluchtpunkt mit einem Backslash hat es geschafft.
quelle