Unix 中的 for 循环和 echo

Unix 中的 for 循环和 echo

我正在尝试编写一个 shell 脚本来列出 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" ]

[ ... ]您应该使用单个=来进行字符串比较。在有的 shell 中,[[ ... ]]您可以使用==

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

相关内容