A variável $ @ não está funcionando em um loop for, tentando iterar através de uma lista de usuários

1

PROBLEMA:

Eu não consigo fazer com que a variável $@ faça o que eu quero em um loop for, o loop apenas envia um nome para o arquivo durante o loop, ele deve percorrer todos os argumentos e gravá-los no arquivo USERS.txt cada na sua própria linha.

Aqui está o arquivo:

something78
something79
something7
dagny
oli
bjarni
toti
stefan_hlynur
jessie

Aqui está 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 eu passo:

./somethingDELETEme.sh jessie henry allison jason

Saída CURRENT:

$./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:

Eu usei essa variável ( $@ ) antes e nunca tive esse problema.

Por que o loop não está interagindo com todos os nomes na lista de argumentos ( $@ ) e como está o caminho certo para codificar isso?

aqui está o código real:

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
}
    
por somethingSomething 18.10.2018 / 06:38

1 resposta

3

O problema é com o uso incorreto de exit 127 em seu loop for, que está saindo após a primeira iteração for-loop. Você precisa agrupar a instrução echo e o exit como um bloco composto em {..} para evitar isso.

echo "$user" >> USERS.txt || { echo "writing to USERS.txt failed"; exit 127; }

Sem esse agrupamento, o que acontece é que || defined se aplica somente para o comando echo e sempre executa o comando exit , não importa se redirecionar para arquivo passado ou falhou porque você tem um separador de comando ; definido lá.

Agora, com o agrupamento composto ativado, todo o conjunto de ações dentro de {..} é tratado como um bloco e ambos são executados se a ação de gravação para USERS.txt falhar.

    
por 18.10.2018 / 06:46