Seu script do awk
{
for(i=1; i<=NF; i+=2) {
pass=pwgen
if(id -u $i | awk {ARG1} > 999) print $1;
else $i pass $i,@email.com >> newusers.txt
}
}
onde ARG1 é o primeiro argumento passado para o script de shell. A primeira aspa simples em seu script de shell inicia um literal com aspas simples que termina com a segunda aspa simples, ou seja, após | awk { . A terceira cota simples inicia outro literal com aspas simples, que termina com a quarta cota simples, etc. Se você deseja incluir uma cota única, é necessário citar a citação. Mas aqui você não precisa de uma única citação no script awk de qualquer maneira. Uma string no awk precisa ser escrita entre aspas duplas.
pass=pwgen
Esta linha de código awk define a variável pass com o valor da variável pwgen . Como pwgen não está definido, pass está definido como um valor vazio.
Você supostamente quis escrever pass='pwgen' , que é a sintaxe do shell para definir a variável pass da shell para a saída do comando pwgen . Mas esta é a sintaxe do shell, não awk, então não é surpresa que não funcione no awk. Você pode ler a saída de um comando no awk com a sintaxe do pipe:
pwgen | getline pass;
close("pwgen");
Você precisa fechar o pipe, caso contrário, a próxima vez que a instrução for executada, ele será lido no mesmo canal em vez de executar uma nova instância de pwgen .
if(id -u $i | awk '{$1}' > 999) print $1;
Você pode usar a função system para executar um comando shell. O comando awk embutido que você escreveu não faz sentido. Eu suspeito que você queria testar se a saída de id -u é maior que 999; isso seria
if (system("id -u " $i "| awk \x27{exit(!($0 > 999))}\x27"))
\x27 é uma maneira de colocar um caractere de aspas simples dentro de uma string awk. Mas isso é muito complicado. Em vez disso, leia a saída de id -u no script awk.
id_command = "id -u " $i;
id_command | getline id;
close(id_command);
if (id > 999) print id;
else $i pass $i,'@email.com' >> newusers.txt
Acho que você quis escrever uma linha no arquivo. Então você precisa de um comando de impressão. Para colocar um espaço entre os elementos, passe-os como argumentos separados para print . Para unir duas strings sem espaços em branco, coloque as strings próximas umas das outras no script awk sem nenhum operador entre (no awk, o operador binário nulo significa concatenação). E como já vimos várias vezes, use aspas duplas ao redor de strings.
else print $i, pass, $i "@email.com" >>"newusers.txt"
Pode haver outros problemas com o seu script, eu não o revisei completamente.