To jest mój pierwszy skrypt bashowy, więc prawdopodobnie popełniam łatwy błąd.
Zasadniczo próbuję napisać skrypt, który pobiera grupy użytkowników, a jeśli należą do określonej grupy, odpowiednio to zarejestruje. Oczywiście będzie więcej funkcji, ale nie ma sensu budować tego, kiedy nie mogę nawet uruchomić wyrażenia regularnego!
Do tej pory mam to:
#!/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
Każde miejsce, w którym próbowałem tego wyrażenia regularnego, działa. Ale w skrypcie bash zawsze wyświetla tylko $groups
, a następnie No match
. Czy ktoś może mi powiedzieć, co jest z tym nie tak?
^([a-zA-Z0-9\-_]+)
a następnie dodaj dwukropek i tak dalej ... powinieneś wkrótce dowiedzieć się, gdzie jest problem.Odpowiedzi:
Od
man 7 regex
:Próba wyrażenia regularnego z egrep daje błąd:
Oto prostsza wersja, która również daje błąd:
Ponieważ
\
nie jest wyjątkowy, jest to zakres, taki jak[a-z]
byłby. Musisz umieścić swoje-
na końcu, takie jak[_-]
lub:Powinno to działać niezależnie od wersji libc (w egrep lub bash).
edycja: Zależy to również od ustawień regionalnych. Strona ostrzega przed tym:
Na przykład:
Oczywiście, mimo że nie popełnił błędu, nie robi tego, co chcesz:
Jest to zakres, który w ASCII, zawiera
\
,[
,^
, i_
.źródło
egrep
nie daje błędu, po prostu dopasowuje go poprawnie.LC_COLLATE="en_US.UTF-8"
:?-
...Ogólna reguła z wyrażeniami regularnymi (i wszelkimi błędami w większych fragmentach kodu): zmniejsz ją i odbuduj krok po kroku lub użyj dzielenia - cokolwiek będzie dla ciebie lepsze.
W tym przypadku sprawcą okazał się znak podkreślenia - ucieczka przed ukośnikiem sprawiła, że zadziałał.
źródło