Para loop e echo no unix

1

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 Samun 16.04.2018 / 17:40

4 respostas

0

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.

    
por 16.04.2018 / 17:48
1

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)
    
por 16.04.2018 / 17:50
1

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
    
por 16.04.2018 / 18:17
0

Use getent para consultar o banco de dados de senhas:

getent passwd 101
    
por 16.04.2018 / 18:53