编写接受组号 (GID) 作为参数的脚本

编写接受组号 (GID) 作为参数的脚本

我正在尝试编写一个接受组号(GID)作为参数的脚本。参数可以是任意数字。该脚本的任务是计算并显示属于给定组的用户数量(基于文件/etc/passwd)。该脚本不能使用awk命令。

我暂时写了

#!/bin/bash 
cat /etc/passwd 
test(){
local dir gid name pass shell uid user
while IFS=':' read user pass uid gid name dir shell ;do
}

我不知道接下来会发生什么?

答案1

所有组都在group数据库中。要计算组的成员数量,请提取成员并计算成员之间的逗号。组成员的数量是 1 加这个数字。

#!/bin/sh

n=$( getent group "$1" | cut -d : -f 4 | grep -o , | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

这种方法的缺点是,即使该组无效,您也始终会获得至少 1 个成员作为输出。不过,我们可以先测试一个有效的组:

#!/bin/sh

if ! getent group "$1" >/dev/null; then
    printf 'No such group: %s\n' "$1" >&2
    exit 1
fi

n=$( getent group "$1" | cut -d : -f 4 | grep -o , | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

该脚本接受数字 GID 和组名称作为其第一个命令行参数。

有了awk,你会做

n=$( getent group "$1" | awk -F : '{ print split($4,dummy,",") }' )

然后不加 1 到$n后面,或者只是

getent group "$1" | awk -F : '
    { 
        printf("There are %d members of group %s (%d)\n",
            split($4,dummy,","), $1, $3)
    }'

没有 (shell)printfn变量。

这会计算数据库中记录的组成员身份group。只计算基本的组成员身份,使用类似的东西

n=$( getent passwd | cut -d : -f 4 | grep -cxF "$1" )

但同样,您可能需要$1首先检查这确实是一个有效的组 ID。

来数数两个都主要和补充组成员资格,最好循环所有用户并id在每个用户上使用:

getent passwd | cut -d : -f 1 |
while read user; do
    if id -G "$user" | tr ' ' '\n' | grep -q -xF "$1"; then
        n=$(( n + 1 ))
    fi
done

这将提取所有用户名,然后调用id -G每个用户名并将生成的 GID 列表转换为换行符分隔的列表。然后确定grep给定的 GID 是否是该列表的一部分,如果是,则n加 1。

或者更快,但更丑,

n=$( getent passwd | cut -d : -f 1 |
     while read user; do
         id -G "$user"
     done | tr ' ' '\n' | grep -c -xF "$1" )

甚至,

n=$( getent passwd    | cut -d : -f 1 |
     xargs -n 1 id -G | tr ' ' '\n'   |
     grep -c -xF "$1" )

这可能是一个好方法的原因是,可能存在其主要组不包含在group数据库中的用户。

相关内容