什么bash代码实现了BASIC的left(),right()和mid()的等效?

时间:2012-10-12 12:25:29

标签: bash substring

我正在编写一些代码来通过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 个答案:

答案 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()等价

请参见上面的链接,网址为提取子字符串标题。