Por que 'ler' não pega todos os meus vars?

0

Minhas desculpas pela pergunta básica, mas alguém pode ajudar a explicar por que o seguinte não foi impresso 3 2 1 6 5 4?

echo '1 2 3 4 5 6' | while read a b c; do echo result: $c b a; done

Os três primeiros números não seriam lidos em ordem, impressos em sentido inverso e depois os últimos três números lidos e invertidos? Eu sei que estou perdendo alguma coisa. Por favor ajude!

    
por Kevin 24.04.2016 / 21:11

2 respostas

9

Você forneceu uma linha com 6 "palavras", mas você as está lendo em três variáveis: a, b e c. A primeira variável a é atribuída a 1, a segunda variável b é atribuída a 2 e c consegue conter o resto da linha: "3 4 5 6".

A saída é 3 4 5 6 b a porque você não escreveu $c $b $a , mas apenas $c b a .

Se você tivesse escrito $c $b $a , o resultado teria sido 3 4 5 6 2 1 .

    
por 24.04.2016 / 21:14
0

O ponto chave que está confundindo você, que a outra resposta ignora, pode ser visto em a página man bash :

read …(options)… [name ...]

    One line is read from the standard input, …, and the first word is assigned to the first name, the second word to the second name, and so on, with leftover words and their intervening separators assigned to the last name.  …         [Emphasis added.]

ou na saída de help read :

read …(options)… [name ...]

    Read a line from the standard input and split it into fields.

    Reads a single line from the standard input, ….  The line is split into fields as with word splitting, and the first word is assigned to the first NAME, the second word to the second NAME, and so on, with any leftover words assigned to the last NAME.  …

O ponto: read nunca lê mais de uma linha.

    
por 24.04.2016 / 21:57