我正在编写一些代码来通过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
问题是组的输出包含用户名。如何返回显示在用户名第二次出现的右侧的输出部分?
如果不能保证用户名作为冒号后的第一组出现,是否有某种方法可以从输出中完全删除用户名?
对于bash4
,您可以根据需要进行调整(使用关联数组):
declare -A arr
for i in $(groups); do arr[$i]=$i; done
user=root
if [[ ${arr[$user]} == $user ]]; then
echo "$user exists"
fi
为什么不直接在:
之后为比赛提供 groups
的输出呢? 例如:
#!/bin/bash
SOME_USER="$1"
SOME_GROUP="$2"
if groups "$SOME_USER" | egrep ":.*b$SOME_GROUPb" > /dev/null
then
echo $SOME_USER is a member of $SOME_GROUP
fi
正则表达式中的b
与单词边界匹配。
号后面的任何内容都是组名。可以拥有一个与用户同名的组(就像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
非常好的教程:https://linuxhandbook.com/bash-strings/
关于这个问题的标题:
如何在 Bash 中实现相当于 Basic()、right() 和 mid() 的
请参阅上面的链接 提取子字符串标题.