ID 101のすべてのユーザーを一覧表示するシェルスクリプトを作成しようとしています。
#!/bin/bash
who="$(who | cut -d ' ' -f 1 | sort -u )";
#Save the output of who
for user in ${who}; do # Iterate over $@
if [ $(echo id -g $user) == "101" ] ; then
echo "Got it";
fi
done;
スクリプトを実行すると、「行4:[:引数が多すぎます」というエラーが発生します。どこでミスをしたのかよくわかりません。
答え1
ただ視聴してみてはいかがでしょうか/etc/group
?
awk -F: '$3==101 { print $4 }'
getent
コンソールで利用可能な場合は、次の手順を実行してリストをインポートして/etc/passwd
噛むことができます。
awf -F: '{print $1}' <(getent group 101)
答え2
エラーは$( echo id -g $user )
単語に拡張されるという事実から発生しますid -g username
。101
拡張が引用されていないので比較できません。
id -g "$user"
出力を比較するには(二重引用符を参照)、次を使用します。
if [ "$( id -g "$user" )" = "101" ]
文字列比較には[ ... ]
単一の項目を使用する必要があります=
。一部のシェルでは、以下を[[ ... ]]
使用できます==
。
if [[ $( id -g "$user" ) == "101" ]]
ここでは命令置換を引用する必要はありませんが[ ... ]
。
これらの操作を実行する慣用的な方法は、パイプの出力をwho
変数に格納するのではなく、ループに直接渡すことです。
who | awk '{ print $1 }' | sort -u |
while read user; do
if [ "$( id -g "$user" )" = "101" ]; then
echo 'Got it'
fi
done
答え3
私は行を次のように変更すると思います。
if [ $(id -g $user) == "101" ]; then
問題を解決します。元のコマンドの出力にはecho
不要と思われるものが一つあります。
答え4
getent
パスワードデータベースを照会するには、次のようにします。
getent passwd 101