グループ番号(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,",") }' )
$n
その後、最後に1を追加しないでください。
getent group "$1" | awk -F : '
{
printf("There are %d members of group %s (%d)\n",
split($4,dummy,","), $1, $3)
}'
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
含まれていないユーザーがいる可能性があるためです。