Skrypty powłoki Bash #6 - łeb jak sklep, czyli tablice
Intro
Dzień dobry, dzień dobry. Dzisiaj opowiem o tych, co wszystko mają w pamięci, czyli o tablicach. :)
Co to ło to to to?
Tablica, czyli z definicji ciągły, rosnący, obszar w pamięci.
nadal pamiętam formułkę :D Tablice, pomagają nam przechowywać dane w ustrukturyzowany sposób, choć same dane już ustrukturyzowane być nie muszą.
W Bash’u wyróżniamy dwa typy tablic:
- indeksowana
- asocjacyjna
Zdziwieni, co? :)
Tablica indeksowana, jak nazwa wskazuje, przyporządkowuje numeryczny indeks dla wartości, które w niej umieszczamy, zaczynają od 0.
Tablica asocjacyjna natomiast przyporządkowuje klucz zamiast numerycznego indeksu.
Jak rodzą się tablice?
Wielu doktorów i profesorów informatyki zadawało sobie to pytanie, na które odpowiedź zna, każdy junior. Cała tajemnica tkwi w inicjacji inicjalizacji.
Do inicjalizacji tablicy indeksowanej możemy wykorzystać jeden z trzech sposobów:
declare -a arr
arr[0]=val
arr=(val1 val2 valn)
W przypadku tablic asocjacyjnych sprawa nie jest już taka różowa, bo by zainicjalizować tablicę asocjacyjną musimy ja zadeklarować, przy pomocy instrukcji declare
. W przeciwnym wypadku interpreter na siłę będzie starał się zrobić tablicę indeksowaną.
Deklaracja tablicy asocjacyjnej:
declare -A assoc_arr
assoc_arr[k1]=v1
assoc_arr[k2]=v2
assoc_arr[k3]=v2
declare -A assoc_arr = ( [k1]=v1 [k2]=v2 [k3]=v3 )
Na blok operacyjny
Poznaliśmy tajniki inicjalizacji teraz, by się przydało poznać operacje, jakie możemy wykonać na tablicach. Operacje są takie same dla obu typów.
Dostęp do wartości
Jak możecie wnioskować z opisu, by uzyskać dostęp do danych w tablicy, odwołujemy się do indeksu lub klucz, zależnie od typu tablicy.
Tablica Indeksowa:
${arr[0]}
Tablica Asocjacyjna:
${assoc_arr[key]}
Wszystkie elementy
Aby uzyskać wszystkie nasze dane z tablicy, wykorzystujemy do tego znaki @
lub *
. Ich działanie jest podobne do tego, które opisałem to w poprzednim poście, na temat zmiennych specjalnych.
${arr[*]}
${arr[@}
Długość tablicy
Do uzyskania długości tablicy wykorzystujemy znak #
przed nazwą zmiennej. Znaku tego będziemy używać również do określania długości łańcucha znakowego.
${#arr[*]}
WAŻNE: konieczne jest podanie znaku
*
lub@
w miejscu adresu, ponieważ sama zmienna tablicowa wskazuje na pierwszy element tablicy i otrzymalibyśmy długość łańcucha znajdującego się na pierwszym miejscu w tablicy.
Wszystkie Klucze/indeksy
By uzyskać wszystkie klucze/indeksy, które znajdują się w naszej tablicy, wstawiamy znak !
przed zmienną:
${!arr[@]}
Usuwanie wartości
W celu usunięcia wartości z pod danego indeksu, jak i całej tablicy wykorzystujemy instrukcję unset
:
unser arr[idx]
Czas się zwijać.
Na dziś to by było na tyle.
Z tablicami można robić jeszcze kilka ciekawych rzeczy, ale są one pokrewne z działaniami na łańcuchach znakowych, o których następnym razem.
Zapraszam :)