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

问题是组的输出包括用户名。如何返回出现在用户名第二次出现右侧的输出部分?

如果不能保证用户名作为冒号后的第一组出现,是否有某种方法可以完全从输出中删除用户名?

4

4 回答 4

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 回答
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

为什么不在 grepgroups之后进行匹配的输出:?例如:

#!/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 回答
0

非常好的教程: https ://linuxhandbook.com/bash-strings/

关于这个问题的标题:

如何在 Bash 中实现等价于 Basic 中的 left()、right() 和 mid()

请参阅提取子字符串标题中的上述链接。

于 2020-11-25T22:34:18.347 回答