0

groups usernameのような結果を返すグループのメンバーシップをテストするコードを書いていますvfclists : vfclists adm dialout cdrom plugdev lpadmin sambashare admin

テスト用コードはこんな感じ

#!/bin/bash
UGROUP=$1
GROUP=$2
GROUPLIST=`groups $1`

echo $UGROUP
echo $GROUP
echo $GROUPLIST

if [[ "$GROUPLIST" == *"$GROUP"* ]]
then
  echo "$UGROUP is a member of $GROUP";
fi

問題は、グループの出力にユーザー名が含まれていることです。ユーザー名の 2 番目の出現の右側に表示される出力の一部を返すにはどうすればよいですか?

コロンの後の最初のグループとしてユーザー名が表示されることが保証されていない場合、出力からユーザー名を完全に削除する方法はありますか?

4

4 に答える 4

1

の場合bash4、必要に応じてこれを調整できます (連想配列を使用)。

declare -A arr

for i in $(groups); do arr[$i]=$i; done

user=root

if [[ ${arr[$user]} == $user ]]; then
    echo "$user exists"
fi
于 2012-10-12T12:32:26.807 に答える
1

groupsの後に一致する出力をgrepしないのはなぜ:ですか?例えば:

#!/bin/bash

SOME_USER="$1"
SOME_GROUP="$2"

if groups "$SOME_USER" | egrep ":.*\b$SOME_GROUP\b" > /dev/null
then
    echo $SOME_USER is a member of $SOME_GROUP
fi

\b正規表現のは、単語の境界に一致します

于 2012-10-12T12:36:40.173 に答える
1

コロンの後に続くものはすべてグループ名です。ユーザーと同じ名前のグループを持つことができます ( の場合と同様vfclists)。コロンの後の文字列だけを分離するには、コロンまでのすべてを削除します。

groups=$(groups $UGROUP)

リストから特定の単語を削除するには、それが別の単語の部分文字列にすぎない場合は削除したくないため、もう少し問題があります。これはうまくいくはずです:

groups=$(groups $UGROUP)
groups=${groups#*:}
groups=${groups/ $UGROUP / } # Remove the word from the middle of the string
groups=${groups% $UGROUP}    # Remove the word if it is the last one
于 2012-10-12T12:46:37.710 に答える