Iterando várias variáveis em um loop for

2

Estou tentando adicionar usuários ao sistema a partir de um arquivo. O arquivo é exatamente assim:

[email protected] password 1
[email protected] baddpassword 2

Os números são seus IDs. Sua vinda de um banco de dados mysql e eu preciso fazer algo com essas variáveis também, então eu preciso de 4 variáveis. O USER, PASS, FIRSTID (sendo 1) e LASTID (sendo o último ID do mysql dump neste caso, 2. Isto está considerando mais de 2 entradas de cada vez)

Até agora, o que eu tenho é isso:

for USER in $(awk -F@ 'NR>1 {print $1}' /root/users_w_pass)
do
    for PASS in $(awk 'NR>1 {print $2}' /root/users_w_pass)
    do
        useradd $USER -d /home/$USER -m
        echo "$USER:$PASS" | chpasswd
        ...


    done
done

Ao executar isso, a senha não é adicionada ao usuário correspondente e não tenho ideia de como devo fazer isso, pois achei que funcionaria, mas posso ver como isso não acontece. Parece loop a senha. Além disso, estou criando arquivos e atribuindo ACLs para cada um, portanto, executar newusers em um arquivo não funcionará aqui, especialmente se houver uma terceira coluna também.

    
por unixpipe 26.04.2014 / 08:54

1 resposta

4

Você não precisa ler as linhas com for . A maneira correta de fazer isso é usar while com read . O read builtin pode analisar automaticamente os campos por linha se eles estiverem separados por espaço em branco (espaços e tabulações). A opção -r garante que as barras invertidas não sejam interpretadas durante a leitura:

while read -r user password id; do
    # strip the @domain part from username
    user="${user%%@*}"
    useradd "$user" -d "/home/$user" -m
    echo "$user:$password" | chpasswd
    # and so on
done < your_input_file

Observe também que você não deve usar variáveis em maiúsculas. $USER já está reservado para seu nome de usuário.

    
por 26.04.2014 / 09:08

Tags