В bash
\
является оператором кавычек, подобным '
и "
. Так:
[[ "$(getent group groupname)" =~ \busername\b ]]
совпадает с:
[[ "$(getent group groupname)" =~ 'b'username'b' ]]
Начиная с bash
3.2, bash гарантирует, что когда вы заключаете символ в регулярное выражение в кавычках, он удаляет его специальное значение как оператора регулярного выражения, если оно было (, что не относится кb
).
В bash
3.1 вы могли бы сделать:
[[ "$(getent group groupname)" =~ '\busername\b' ]]
И вы все еще можете это сделать, если включите опцию bash31
или установите $BASH_COMPAT
на 3.1
. Это также будет работать в zsh
.
Это сработало бы в системах, где системная расширенная библиотека регулярных выражений поддерживает это \b
не -стандартное расширение (, как в последних системах GNU ).
В bash 3.2 и более поздних версиях это не работает, потому что, цитируя \
, bash удаляет особенность \
как оператора регулярного выражения (, по сути, он вызывает библиотеку регулярных выражений с \\busername\\b
.
Что вы можете сделать, так это написать это:
regexp='\' # here using the slightly more portable \< \> instead of \b
[[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted
Тогда он будет работать как с bash 3.1, так и с bash 3.2+ (, а также с zsh и ksh93 ). См. . Как сохранение регулярного выражения в переменной оболочки позволяет избежать проблем с заключенными в кавычки символами, специфичными для оболочки? для получения более подробной информации об этом.
А здесь,Я бы использовал стандартный синтаксис sh
и сделал бы:
group=groupname
user=username
group_definition=$(getent -- group "$group") || exit
case,${group_definition##*:}, in
(*,"$user",*) printf '%s\n' "$user is in the $group group\n"
esac
Это также работает более надежно, если имя пользователя содержит операторы регулярного выражения(.
часто встречается в именах пользователей )или имя пользователя совпадает с именем группы.