read command não lerá as linhas do arquivo em várias vars

0

Sou muito novo em bash . Eu tenho um arquivo chamado osss no meu diretório de trabalho atual e meu script é:

read s1 s2 s3 < <( more osss) 
echo "$s1 $s2 $s3" 
exit 

O conteúdo de osss é:

Fooo
Booo
Mooo

Fooo está atribuído a s1 , mas booo e mooo não estão atribuídos a s2 e s3 .

A pergunta é: por quê? E onde eu fiz errado?

    
por user705911 15.08.2017 / 13:56

2 respostas

1

Um único read lê uma única linha. Múltiplas palavras na linha podem ser atribuídas a múltiplas variáveis.

Mas você não tem várias palavras em uma única linha. Você tem várias linhas. Você precisa de três comandos read para ler isto. Ou você pode repetir um único comando três vezes.

Além disso, este fragmento

… < <( more osss)

parece estranho. <osss pode ser o suficiente. Eu acho que isso não tem nada a ver com seu problema atual.

    
por 15.08.2017 / 14:44
0

The question is: why? And where did I do it wrong?

A resposta é que você não está usando a função certa para o trabalho, e você está usando errado. Veja o homem leu para esclarecer, a partir de onde diz:

Read one line

Para realizar o que parece ser seu objetivo, eu faria:

readarray -t lines < osss
printf "%s " "${lines[@]}"

Explicação: Primeiro, leia todas as linhas em uma matriz e, em seguida, imprima todos os itens da matriz separados por um espaço. Isso faz mais sentido do que criar variáveis individuais e usar loops e não requer conhecimento prévio do número total de linhas.

Observação: existem várias ferramentas que processam arquivos de texto linha por linha, como sed , awk , perl -lane , php -r . Dependendo do que você precisa fazer, salvar o conteúdo das linhas em bash variáveis pode ser supérfluo.

    
por 15.08.2017 / 22:15