我正在尝试编写一个 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 username
。101
由于扩展未加引号,因此无法进行比较。
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