[[]]で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

また、ユーザー名に正規表現演算子(.ユーザー名と共通)が含まれている場合、またはユーザー名がグループ名と同じ場合でも、より確実に機能します。

関連情報