Это мой первый раз, когда я использую bash-скрипты, поэтому я, вероятно, делаю легкую ошибку.
По сути, я пытаюсь написать сценарий, который получает группы пользователей, и, если они находятся в определенной группе, он будет регистрировать это соответствующим образом. Очевидно, будет больше функциональности, но нет смысла строить это, когда я даже не могу заставить работать регулярное выражение!
Пока у меня есть это:
#!/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
В каждом месте, где я пробовал это регулярное выражение, это работает. Но в скрипте bash он только выводит $groups
, а затем No match
. Так может кто-нибудь сказать мне, что с ним не так?
^([a-zA-Z0-9\-_]+)
затем добавьте двоеточие и так далее ... вы должны довольно скоро выяснить, в чем проблема.Ответы:
От
man 7 regex
:Попытка регулярного выражения с egrep дает ошибку:
Вот более простая версия, которая также выдает ошибку:
Так
\
как не является особенным, это диапазон, как[a-z]
хотелось бы. Вы должны поставить свой-
в конце, как[_-]
или:Это должно работать независимо от вашей версии libc (в egrep или bash).
изменить: это на самом деле зависит от ваших настроек локали тоже. Руководство действительно предупреждает об этом:
Например:
Конечно, даже если это не ошибка, он не делает то, что вы хотите:
Это диапазон, который в ASCII, включает в себя
\
,[
,^
, и_
.источник
egrep
дает ошибки, просто соответствует правильно.LC_COLLATE="en_US.UTF-8"
?-
...Общее правило с регулярными выражениями (и любыми ошибками в больших кусках кода): сокращайте его и перестраивайте его шаг за шагом или используйте разделение на части - все, что работает лучше для вас.
В этом случае виновником оказалось подчеркивание - выход из него с обратной косой чертой заставил его работать.
источник