[[ ]]에서 bash 정규식 일치가 실패합니다.

[[ ]]에서 bash 정규식 일치가 실패합니다.

사용자가 특정 그룹에 속해 있는지 확인하고 싶습니다.

[[ "$(getent group groupname)" =~ \busername\b ]]

그러나 다음은 작동하지만 이것은 작동하지 않습니다(bash 5.0.3).

getent group groupname | grep -E "\busername\b"

백 슬래시가 어딘가에 먹힌 것 같은 것을 알았습니다.

bash -cx '[[ "$(getent group groupname)" =~ \busername\b ]]'
++ getent group groupname
+ [[ groupname:x:24:username =~ busernameb ]]

그러나 이것 역시 영향을 미칠 수 있습니다 -x.

누구든지 이것을 명확히 할 수 있습니까? :-)

답변1

에서는 bash및 와 \같은 참조 연산자입니다 . 그래서:'"

[[ "$(getent group groupname)" =~ \busername\b ]]

동일합니다:

[[ "$(getent group groupname)" =~ 'b'username'b' ]]

3.2 부터 bashbash는 정규식에서 문자를 인용할 때 정규식 연산자가 있는 경우(그렇지 않음 b) 정규식 연산자로서의 특별한 의미를 제거합니다.

3.1 에서는 bash다음을 수행할 수 있습니다.

[[ "$(getent group groupname)" =~ '\busername\b' ]]

해당 bash31옵션을 켜거나 로 설정 하면 $BASH_COMPAT이 작업을 계속할 수 있습니다 3.1. 이는 에도 적용됩니다 zsh.

이는 시스템 확장 정규식 라이브러리가 \b비표준 확장(예: 최신 GNU 시스템)을 지원하는 시스템에서 작동합니다.

bash 3.2 이상에서는 참조로 \bash가 정규식 연산자라는 특수성을 제거하기 때문에 작동하지 않습니다 \(실제로는 \\busername\\b.

당신이 할 수 있는 일은 다음과 같이 작성하는 것입니다.

regexp='\<username\>' # 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

또한 사용자 이름에 정규식 연산자( .사용자 이름과 공통)가 포함되어 있거나 사용자 이름이 그룹 이름과 동일한 경우에도 더 안정적으로 작동합니다.

관련 정보