Eu gostaria de ler diferentes linhas de um arquivo de texto para diferentes variáveis. Por exemplo
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Quero que este resultado a ser armazenados em variáveis var1
, var2
, var3
e var4
de tal forma que
var1=line1 foo foobar bar
var2=line2 bar
e assim por diante.
Alguém poderia me dizer como é feito. Eu tentei usar eval
em um loop for. Não parece funcionar.
grep
,cut
, et. Al.), é muito melhor fazer apenas o que você precisa fazer. Não microgerencie em um script de shell; orquestrar ferramentas para realizar o trabalho.Respostas:
Você faria:
Ou:
(menos eficiente, pois
line
raramente é incorporado e a maioria dos shells precisa se bifurcar para implementar a substituição de comandos.line
também não é mais um comando padrão).Para usar um loop:
Ou para definir automaticamente os nomes das variáveis como
line<++n>
:Observe que
bash
suporta variáveis de matriz e umreadarray
builtin para ler linhas em uma matriz:Observe, no entanto, que, ao contrário da maioria dos outros shells, os
bash
índices da matriz começam em 0 e não 1 (herdados deksh
), portanto a primeira linha estará dentro${line[0]}
, não${line[1]}
(embora como o @Costas tenha mostrado , você pode fazerreadarray
(akamapfile
) começar a escrever os valores no índice 1 (bash
matrizes também contrárias à maioria das outras conchas sendo matrizes esparsas ) com-O 1
).Consulte também: Entenda "IFS = read -r line"?
fonte
Eu ofereceria usar matriz para essas tarefas
assim você vai ter cada linha
${var[1]}
,${var[2]}
e assim por diantefonte
Não é exatamente o que você solicitou, mas pode funcionar para suas necessidades. Você pode serializar os dados com o Awk. Observe que isso será interrompido se seu $ 1 não for um nome de variável válido:
Resultado:
fonte