Unixのforループとエコ

Unixのforループとエコ

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 username101拡張が引用されていないので比較できません。

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

関連情報