Você pode usar os descritores de arquivo para ler a entrada dos dois arquivos em um execução de loop único enquanto. Aqui está um exemplo:
#!/bin/bash
# Assign file descriptors to users and passwords files
exec 3< users.txt
exec 4< passwords.txt
# Read user and password
while read iuser <&3 && read ipasswd <&4 ; do
# Just print this for debugging
printf "\tCreating user: %s with password: %s\n" $iuser $ipasswd
# Create the user with adduser (you can add whichever option you like)
adduser $iuser
# Assign the password to the user, passwd must read it from stdin
echo $ipasswd | passwd --stdin $iuser
done
Observe como passwd
é solicitado a ler a senha de stdin
.
Você pode precisar adicionar muitas verificações de sanidade para o código acima, como verificar se existem arquivos, nomes de usuário não têm espaços, o usuário ainda não existe no sistema, etc ...
Você também pode estender o script para aceitar ambos os nomes de arquivos como argumentos de entrada.
Esta resposta no estouro de pilha foi muito útil.