Chciałbym przeczytać różne wiersze pliku tekstowego dla różnych zmiennych. Na przykład
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Chcę wynik ten powinien być przechowywany w zmiennych var1
, var2
, var3
i var4
takie, które
var1=line1 foo foobar bar
var2=line2 bar
i tak dalej.
Czy ktoś mógłby mi powiedzieć, jak to się robi. Próbowałem użyć eval
w pętli for. Wydaje się, że to nie działa.
grep
,cut
et. Al.), o wiele lepiej jest robić to, co trzeba. Nie wykonuj mikromanagowania w skrypcie powłoki; koordynuj narzędzia, aby wykonać zadanie.Odpowiedzi:
Zrobiłbyś:
Lub:
(mniej wydajne, ponieważ
line
rzadko jest wbudowane, a większość powłok wymaga rozwidlenia w celu zaimplementowania zastępowania poleceń. nieline
jest też już standardowym poleceniem).Aby użyć pętli:
Lub, aby automatycznie zdefiniować nazwy zmiennych jako
line<++n>
:Zauważ, że
bash
obsługuje zmienne tablicowe ireadarray
wbudowane do odczytu linii w tablicy:Zauważ jednak, że w przeciwieństwie do większości innych powłok,
bash
indeksy tablic zaczynają się od 0, a nie 1 (dziedziczone zksh
), więc pierwszy wiersz będzie${line[0]}
, a nie${line[1]}
(chociaż jak pokazał @Costas , możeszreadarray
(akamapfile
) zacząć zapisywać wartości w indeksie 1 (bash
tablice również w przeciwieństwie do większości innych powłok są rzadkimi tablicami) z-O 1
).Zobacz także: Zrozumieć „IFS = read -r line”?
źródło
Proponuję użyć tablicy do takich zadań
więc musisz każdą linię
${var[1]}
,${var[2]}
i tak dalejźródło
Nie jest to dokładnie to, o co prosiłeś, ale może działać dla twoich potrzeb. Możesz serializować dane za pomocą Awk. Zauważ, że to się zepsuje, jeśli 1 $ nie jest prawidłową nazwą zmiennej:
Wynik:
źródło