Eu acredito que mudar a linha seja:
if [ $(id -g $user) == "101" ]; then
resolverá o problema. O comando original tinha um echo
na saída, o que, acredito, não é necessário.
Eu estou tentando escrever um script de shell para listar todos os usuários que possuem 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;
quando executo meu script, recebo este erro "linha 4: [: muitos argumentos". Não tenho certeza de onde cometi o erro.
Por que não olhar diretamente para /etc/group
?
awk -F: '$3==101 { print $4 }'
Se getent
estiver disponível no seu host, você pode fazer isso para obter uma lista obtida de /etc/passwd
, que é então mastigada:
awf -F: '{print $1}' <(getent group 101)
O erro vem do fato de que $( echo id -g $user )
será expandido para as palavras id -g username
. Isso não pode ser comparado a 101
, já que a expansão não é citada.
Para comparar a saída de id -g "$user"
(observe as aspas duplas), use
if [ "$( id -g "$user" )" = "101" ]
Dentro de [ ... ]
, você deve usar uma única comparação de =
para fazer uma string. Em shells que têm [[ ... ]]
você pode usar ==
:
if [[ $( id -g "$user" ) == "101" ]]
Aqui, a citação da substituição do comando não é necessária, mas é se você usar [ ... ]
.
A maneira idiomática de fazer esse tipo de tarefa não é armazenar a saída do who
pipeline em uma variável, mas passá-la diretamente para o loop:
who | awk '{ print $1 }' | sort -u |
while read user; do
if [ "$( id -g "$user" )" = "101" ]; then
echo 'Got it'
fi
done
Use getent
para consultar o banco de dados de senhas:
getent passwd 101
Tags bash shell-script