PROBLEMA:
Não consigo fazer com que a $@
variável faça o que quero em um loop for, o loop envia apenas um nome para o arquivo durante o loop, ele deve percorrer todos os argumentos e gravá-los no arquivo USERS.txt
, cada um em sua própria linha.
Aqui está o arquivo:
something78
something79
something7
dagny
oli
bjarni
toti
stefan_hlynur
jessie
Segue o código de teste:
#!/bin/bash
prepare_USERS()
{
/usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > USERS.txt
/bin/chmod 777 USERS.txt
echo "$@"
for user in "$@"
do
echo $user
echo "$user" >> USERS.txt || echo "writing to USERS.txt failed"; exit 127
done
}
prepare_USERS "$@"
#for user in "$@"
#do
# echo "$user" >> USERS.txt
#done
for user in USERS.txt
do
printf "%s" $user
done
Aqui estão os argumentos que passo:
./somethingDELETEme.sh jessie henry allison jason
Saída CORRENTE:
$./somethingDELETEme.sh jessie henry allison jason
jessie henry allison jason
jessie
Saída ESPERADA:
O loop percorre todos os nomes da lista de argumentos e os grava no arquivo USERS.txt
.
PERGUNTA:
Já usei essa variável ( $@
) antes e nunca tive esse problema.
Por que o loop não está iterando por todos os nomes na lista de argumentos ( $@
) e como é a maneira correta de codificar isso?
AQUI ESTÁ O CÓDIGO VERDADEIRO:
prepare_USERS()
{
checkIfUser
/usr/bin/awk -F: '$3 >= 1000 { print $1 }' /etc/passwd > "$CURRENTDIR"/USERS.txt
/bin/chmod 777 "CURRENTDIR"/USERS.txt
for user in "$@"
do
echo "$user" >> "CURRENTDIR"/USERS.txt || echo "writing to USERS.txt failed"; exit 127
done
}
O problema está no uso incorreto de
exit 127
seu loop for, que está saindo após a primeira iteração do loop for. Você precisa agrupar aecho
instrução eexit
como um bloco composto{..}
para evitar isso.Sem esse agrupamento, o que acontece é que o
||
definido se aplica apenas aoecho
comando e sempre execute oexit
comando, não importa se o redirecionamento para o arquivo foi aprovado ou falhou, porque você tem um separador de comando;
definido lá.Agora com o agrupamento composto habilitado, todo o conjunto de ações dentro dele
{..}
é tratado como um bloco e ambos são executados se a ação de escritaUSERS.txt
falhar.