![编写接受组号 (GID) 作为参数的脚本](https://linux22.com/image/145866/%E7%BC%96%E5%86%99%E6%8E%A5%E5%8F%97%E7%BB%84%E5%8F%B7%20(GID)%20%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我正在尝试编写一个接受组号(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)printf
或n
变量。
这会计算数据库中记录的组成员身份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
数据库中的用户。