readarray
- readarray – builtin w Bash służący do odczytywania całego wejścia (lub określonej liczby linii) i zapisywania ich jako elementy tablicy.
- Alias
mapfile
– obie nazwy działają identycznie. - Zastosowania: szybkie wczytywanie plików, wyników poleceń, przetwarzanie wejścia bez pisania pętli
while read
.
Składnia
Dział zatytułowany „Składnia”readarray [opcje] nazwa_tablicy
- Domyślnie czyta ze standardowego wejścia.
- Każda linia wejścia trafia do kolejnego elementu tablicy, zachowując znak nowej linii (chyba że użyto
-t
).
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
-n <liczba> | Wczytaj maksymalnie <liczba> linii. |
-O <indeks> | Zacznij zapisywanie od podanego indeksu tablicy. |
-s <liczba> | Pomiń podaną liczbę pierwszych linii wejścia. |
-t | Usuń końcowe znaki nowej linii z każdej linii. |
-u <fd> | Czytaj z określonego deskryptora pliku. |
-C <callback> | Wykonuj funkcję callback po wczytaniu bloku linii (określa -c ). |
-c <liczba> | Liczba linii w bloku przekazywanym do callbacka. |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1) Wczytanie całego pliku do tablicyreadarray linie < plik.txtecho "Pierwsza linia: ${linie[0]}"
# 2) Wczytanie pliku bez znaków nowej liniireadarray -t linie < plik.txt
# 3) Wczytanie wyniku polecenia do tablicyreadarray -t pliki < <(ls -1 /etc)
# 4) Wczytanie z pominięciem pierwszych 2 liniireadarray -t -s 2 dane < plik.csv
# 5) Wczytanie z offsetem – dopisywanie do istniejącej tablicyreadarray -t -O ${#tab[@]} tab < nowy.txt
- Tylko Bash:
readarray
imapfile
dostępne od Bash 4.0. - Nowe linie: Domyślnie zachowuje
\n
– użyj-t
, jeśli chcesz je usunąć. - Wydajność: Szybsze niż pętla
while read
, bo działa w C wbudowanym w Bash. - EOF: Kończy odczyt po EOF lub po osiągnięciu limitu linii.
- Callback: Opcje
-C
i-c
przydają się przy przetwarzaniu dużych plików w blokach.
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie |
---|---|---|
bash: readarray: command not found | Używasz powłoki innej niż Bash lub wersji <4.0 | Uruchom Bash 4+ lub użyj pętli while read . |
Znak nowej linii w elementach tablicy | Domyślne zachowanie readarray | Użyj opcji -t , by go usunąć. |
Wczytanie pustych linii na początku | Plik zaczyna się pustymi liniami | Użyj -s , by je pominąć. |