什么 bash 代码实现了 BASIC 中的 left()、right() 和 mid() 的等价物



我正在编写一些代码来通过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() 的

请参阅上面的链接 提取子字符串标题.

相关内容

  • 没有找到相关文章

最新更新