我正在编写一些代码来通过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
问题是组的输出包括用户名。如何返回显示在用户名第二个外观右侧的输出部分?
如果无法保证用户名作为冒号后的第一个组的外观,是否有某种方法可以从输出中删除用户名?
答案 0 :(得分: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
答案 1 :(得分:1)
为什么不在groups
之后为匹配的:
输出?例如:
#!/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
正则表达式matches a word boundary中的\b
。
答案 2 :(得分: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
答案 3 :(得分:0)
非常好的教程: https://linuxhandbook.com/bash-strings/
关于以下问题的标题:
如何在Bash中实现Basic中的left(),right()和mid()等价
请参见上面的链接,网址为提取子字符串标题。