Dogłębne tablice bash

Dogłębne tablice bash
W BASH tablica może być tablicą indeksowaną lub tablicą asocjacyjną. Z indeksowanej tablicy to lista, której elementy są ponumerowane od zera. Tablica asocjacyjna to lista, w której ciągnie zastąpiły liczby. Przyjmij długopis, książkę ćwiczeń, podręcznik, władca, 42 USD i ołówek na stole do nauki. Te 6 elementów można zapisać jako listę, w następujący sposób:
  1. długopis
  2. ćwiczenia
  3. podręcznik
  4. linijka
  5. 42
  6. ołówek

To jest przykład indeksowanej tablicy. Istnieje 6 elementów, ale elementy zostały ponumerowane od zera do 5. Numerowanie w ten sposób jest indeksowanie. Liczenie indeksu w Bash zaczyna się od zera, a nie 1.

Każdy z tych produktów jest wytwarzany z niektórych głównych materiałów. Lista głównego materiału, a następnie jego gotowy produkt, to:

Atrusz => pióro
Miękki papier => Książka ćwiczeń
twardy papier => podręcznik
plastik => linijka
Specjalny papier => 42
drewno => ołówek

To jest przykład tablicy asocjacyjnej. Nie wystarczy po prostu wpisać te tablice w pliku bash. Każdy z różnych rodzajów tablic musi zostać zakodowany. Kodowanie tablicy indeksowanej jest podobne do kodowania tablicy asocjacyjnej. Istnieją jednak małe, ale ważne różnice. W tym artykule dogłębne spojrzenie na tablice Bash.

Treść artykułu

  • Indeksowana tablica
  • Tablica asocjacyjna
  • Wniosek

Indeksowana tablica

Tworzenie indeksowanej tablicy

Jednym ze sposobów utworzenia powyższej tablicy jest następujący:

arr = (Pen 'Ćwiczenie książki „podręcznik” linijka 42 ołówek)

Tutaj ARR to nazwa tablicy. Programista mógł nadać inną nazwę. Przestrzenie oddzielają różne elementy na liście tablic. Jeśli element składa się z więcej niż jednego słowa, jest wpisywany w pojedynczych lub podwójnych cytatach. Indeks pióra wynosi 0; Indeks „Książka ćwiczeń” wynosi 1; Indeks „podręcznika” wynosi 2; Wskaźnik linijki to 3; Indeks dla 42 wynosi 4; indeks ołówka wynosi 5.

Inny sposób tworzenia powyższej tablicy zaczyna się następująco:

ARR [2] = "podręcznik"

Oznacza to, że tablica jest tworzona, zaczynając od dowolnego elementu na liście. „2” w nawiasach kwadratowych jest znane jako indeks dolny. Pozostałe elementy można uwzględnić później, w następujący sposób:

ARR [0] = pióro
ARR [1] = „Książka ćwiczeń”
ARR [3] = linijka
ARR [4] = 42
ARR [5] = ołówek

Zauważ, że w włączeniu element indeksu 2 nie został powtórzony.

Innym sposobem utworzenia powyższej tablicy jest następujący:

Deklaruj -ARR

Tutaj „oświadczenie” jest zastrzeżonym słowem. „-a” oznacza tablicę indeksowaną. „ARR” to nazwa wyboru programisty. Wszystkie elementy można następnie uwzględnić w następujący sposób:

ARR [0] = pióro
ARR [1] = „Książka ćwiczeń”
ARR [2] = "podręcznik"
ARR [3] = linijka
ARR [4] = 42
ARR [5] = ołówek

To jest włączenie przez zadanie. Pamiętaj, że gdy jakakolwiek wartość jest przypisana do zmiennej, nie powinno być miejsca między operatorem przypisania, = a zmienną lub wartością.

Odwołując się do indeksowanego elementu

Składnia do odwołania się do elementu to:

$ Nazwa [indeks dolny]

Gdzie nazwa jest nazwą tablicy, taką jak ARR. Kloprze jest liczbą całkowitą (liczbą).

Pozytywne wskaźniki

Liczenie indeksu zwykle zaczyna się od zera. W poniższym kodzie wartości elementów są odczytywane i wyświetlane:

arr = (Pen 'Ćwiczenie książki „podręcznik” linijka 42 ołówek)
dla ((i = 0; i < 6; ++i)); do
echo $ arr [i]
zrobione

Wyjście to:

długopis
ćwiczenia
podręcznik
linijka
42
ołówek

Sześć elementów zaczyna się od zera indeksu do indeksu 5. Tak więc iteracja odbywa się 6 razy, a nie 5 razy.

Wskaźniki ujemne

Do dostępu do elementów można użyć wskaźników ujemnych. W takim przypadku -1 odnosi się do ostatniego elementu; -2 odnosi się do elementu ostatniego, ale jednego; -3 odnosi się do elementu przed elementem ostatniego drugiego i tak dalej. Tak więc dla powyższej tablicy -6 odnosi się do pierwszego elementu. Poniższy kod to ilustruje:

arr = (Pen 'Ćwiczenie książki „podręcznik” linijka 42 ołówek)
for ((i = -1; i> = -6; --i)); Do
echo $ arr [i]
zrobione

Wyjście to:

ołówek
42
linijka
podręcznik
ćwiczenia
długopis

Wyświetlacz jest w odwrotnej kolejności.

Wyświetlanie wszystkich elementów w tablicy indeksowanej

Aby wyświetlić wszystkie elementy, $ nazwa [*] lub $ name [@]. W tych wyrażeniach * lub @ jest w miejscu indeksu. I dzięki temu, zamiast zwracać wartości elementów, zwracane są wartości elementów obecnych w tablicy. Poniższy kod to ilustruje:

Deklaruj -ARR
ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
echo $ arr [@]
echo $ arr [*]

Wyjście jest,
Ołówek władcy książki ćwiczeń
Ołówek władcy książki ćwiczeń

Zauważ, że @ i * używane w ten sposób są synonimami. Istnieje problem z wyjściem: wyrażenia są oddzielone przestrzeniami i nie można ich rozróżnić. Poniższy kod powinien oddzielić frazy za pomocą przecinków:

Deklaruj -ARR
ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
IFS =,
echo "$ arr [@]"
echo "$ arr [*]"

Wyjście jest teraz:

Ołówek władcy książki ćwiczeń
Książka ćwiczeń, władca, ołówek

IFS oznacza wewnętrzny separator pola. Przypisano mu przecinek. Zwróć uwagę na użycie podwójnych cytatów dla $ arr [@] i $ arr [*] w poleceniach echo. Przecinki zostały uwzględnione dla * indeksu indeksowego, a nie dla indeksu @. Jest jeszcze inny problem: w drugiej linii wyjściowej, w której zastosowano przecinki, przestrzenie nie zostały wyświetlone. Więc @ i * nie są synonimami przez cały czas. Możliwe jest jednak rozdzielenie się od przecinka i przestrzeni - patrz poniżej.

Wyświetlanie wskaźników tablicy indeksowanej

Wyrażenie, $ !Nazwa [@] lub $ !Nazwa [*] Zwraca wskaźniki tablicy jako listy, oddzielone przestrzeniami. Zwróć uwagę na użycie i pozycję znaku wykrzyknika (!). Poniższy kod pokazuje użycie tych wyrażeń:

ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
echo $ !ARR [@]
echo $ !ARR [*]

Wyjście to:
1 3 5
1 3 5

Długość tablicy indeksowanej

Długość tablicy jest podana przez:

$ #nazwa [indeks dolnej]

Gdzie nazwa to nazwa, taka jak ARR, który programista nadał tablicy; Klopa dolna jest najwyższym indeksem (długość - 1) dla elementu, którego wartość jest ustawiona. Zwróć uwagę na użycie i pozycję symbolu, #. Poniższy kod to ilustruje:

arr = (Pen 'Ćwiczenie książki „podręcznik” linijka 42 ołówek)
echo $ #arr [5]

Wyjście to 6. Nawet jeśli niektóre lub wszystkie dolne elementy nie są obecne, długość nadal byłaby najwyższa_index + 1. Poniższy kod to ilustruje:

Deklaruj -ARR
ARR [3] = linijka
ARR [5] = ołówek
echo $ #arr [5]

Dane wyjściowe jest nadal 6, mimo że nie ma żadnego elementu, dla indeksu 0, indeks 1, indeks 2 i indeks 4.

Liczba elementów tablicy indeksowanej

Jak widać powyżej, liczba elementów w tablicy może być mniejsza niż długość tablicy. Wynika to z faktu, że wartości niektórych elementów poniżej ostatniego elementu nie zostały utworzone ani nie zostały niepotrzebne. Wyrażenie podaje liczbę elementów ustawionych w indeksowanej tablicy, $ #arr [@] lub $ #arr [*], jak pokazano w następującym kodzie:

ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
echo $ #arr [@]
echo $ #arr [*]

Wyjście to:

3
3

Wyświetlanie tylko indeksowanych elementów zestawu tablicy

Element indeksu przypisany wartość jest ustawiona, podczas gdy ten, który nie jest przypisany wartość, jest niezajemna. Poniższy kod wyświetla tylko ustawione wartości:

ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
dla ((i = 0; i < $#arr[5]; ++i)); do
Jeśli [ ! -Z "$ arr [i]"]; Następnie
printf "$ arr [i],"
fi
zrobione
Echo

Wyjście to:

Książka ćwiczeń, władca, ołówek,

Zwróć uwagę, w jaki sposób elementy Unset zostały zidentyfikowane i wyeliminowane z iteracji w stanie. Należy również zauważyć, że w stanie $ arr [i] jest w podwójnych cytatach jako „$ arr [i]”, aby wydrukować wartości zawierające przestrzenie zawierające przestrzenie. Polecenie PrintF jest podobne do polecenia Echo, ale nie dodaje nowego wiersza po wyświetleniu. Możliwe było oddzielenie wartości na wyjściu, przecinkiem i przestrzenią, w jednej linii. Ostatnie echo spowodowałoby przejście następnego wyjścia do następnego wiersza.

Prostsza forma powyższego kodu jest następująca:

ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
bo w $ !arr [@]; Do
printf "$ arr [i],"
zrobione
Echo

Wyjście jest takie same. Zwróć uwagę na wyrażenie listy po zastrzeżonym słowie, w. To wyrażenie zwraca listę wskaźników. Więc nie ma potrzeby tutaj klimatu IF.

Ustawienie i niepewne indeksowane elementy i jego tablica

Każdy indeksowany element, który nie przypisano wartości, jest niezainałowy. Indeksowany element, który ma przypisaną do niego wartość. Teraz element może być celowo nieseet, jak pokazuje następujący skrypt:

ARR [1] = „ćwiczenie książka” arr [3] = linijka arr [5] = ołówek
Unset ARR [3]
bo w $ !arr [@]; Do
printf "$ arr [i],"
zrobione
Echo

Wyjście to:

Książka ćwiczeń, ołówek,

„Władca” nie został wyświetlony. Składnia, aby rozejmować element, wynosi:

Unset ArrayName [dolna indencja]

Składnia do usunięcia lub rozwiązywania całej tablicy jest:

Unset ArrayName

Lub

Unset ArrayName [@]

Lub

Unset ArrayName [*]

W poniższym kodzie cała tablica jest niezajemna:

arr = (Pen 'Ćwiczenie książki „podręcznik” linijka 42 ołówek)
Unset ARR
echo "$ arr [*]"

Wyjście jest niczym (pusta linia), ponieważ cała tablica była nieskażona.

Tablica asocjacyjna

Jak wskazano powyżej, przykładem asocjacyjnej tablicy napisanej na papierze jest:

Atrusz => pióro
Miękki papier => Książka ćwiczeń
twardy papier => podręcznik
plastik => linijka
Specjalny papier => 42
drewno => ołówek

Istnieje 6 elementów, z których każdy składa się z pary klucza/wartości. W przypadku pierwszego elementu „atrament” jest kluczem, a „pióro” jest wartością; Dla drugiego elementu „miękki papier” jest kluczową, a „książka ćwiczeń” jest wartością; i tak dalej.

Tworzenie tablicy asocjacyjnej

Jednym ze sposobów utworzenia powyższej tablicy jest następujący:

Declare -a arr = ([INK] = Pen [miękki papier] = „ćwiczenie” [twardy papier] = "książka tekstowa" [plastik] = linijka [Papier specjalny] = 42 [drewno] = ołówek)

Tutaj ARR to nazwa tablicy. Programista mógł nadać inną nazwę. Przestrzenie oddzielają różne elementy na liście tablic. Jeśli wartość składa się z więcej niż jednego słowa, jest wpisywana w pojedynczych lub podwójnych cytatach. Klucz może składać się z więcej niż jednego słowa. W tej zakodowanej tablicy asocjacyjnej znajduje się 6 par kluczy/wartości. Klucz jest umieszczony w kwadratowych nawiasach. Wartość jest przypisana do klucza z operatorem przypisania. „-A” oznacza tablicę asocjacyjną i powinna tam być.

Inny sposób tworzenia powyższej tablicy zaczyna się następująco:

Deklaruj -ARR

Tutaj „oświadczenie” jest zastrzeżonym słowem. „-A” oznacza tablicę asocjacyjną (podczas gdy „-a” oznacza tablicę indeksowaną). „ARR” to nazwa wyboru programisty. Elementy można następnie uwzględnić w następujący sposób:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenia”
ARR [plastik] = linijka
ARR [drewno] = ołówek

Wszystkie elementy (6) niekoniecznie powinny być włączone jednocześnie. Resztę można dodać później. To jest dodawane przez przypisanie. Pamiętaj, że gdy jakakolwiek wartość jest przypisana do zmiennej, nie powinno być miejsca między operatorem przypisania, = a zmienną lub wartością.

Odwołując się do asocjacyjnego elementu tablicy

Składnia do odwołania się do elementu tablicy asocjacyjnej jest:

$ Nazwa [indeks dolny]

Gdzie nazwa jest nazwą tablicy, taką jak ARR. Klopa dolna jest kluczem w formularzu tekstowym. W poniższym kodzie wartości elementów są odczytywane i wyświetlane:

Declare -a Arr = ([INK] = Pen [miękki papier] = „ćwiczenie” [twardy papier] = "podręcznik" [plastik] = linijka [Papier specjalny] = 42 [Wood] = ołówek)
echo $ arr [INK]
echo $ arr [miękki papier]
echo $ arr [twardy papier]
echo $ arr [plastik]
echo $ arr [Special Paper]
echo $ arr [Wood]

Wyjście to:

długopis
ćwiczenia
podręcznik
linijka
42
ołówek

Wyświetlanie wszystkich wartości w tablicy asocjacyjnej

Aby wyświetlić wszystkie wartości, $ nazwa [*] lub $ name [@]. W tych wyrażeniach * lub @ jest na miejscu klucza. I dzięki temu, zamiast zwracać wartości elementów, zwracane są wartości elementów obecnych w tablicy. Poniższy kod to ilustruje:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenie” arr [plastik] = linijka arr [drewno] = ołówek
echo $ arr [@]
echo $ arr [*]

Wyjście jest,

Władca książek o ołówku
Władca książek o ołówku

Kolejność wartości na wyjściu nie musi odpowiadać zamówieniu w tablicy asocjacyjnej. Zauważ, że @ i * używane w ten sposób są synonimami. Istnieje problem z wyjściem: wyrażenia są oddzielone przestrzeniami i nie można ich rozróżnić. Poniższy kod oddziela frazy za pomocą przecinków:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenie” arr [plastik] = linijka arr [drewno] = ołówek
IFS =,
echo "$ arr [@]"
echo "$ arr [*]"

Wyjście jest teraz:

Władca książek o ołówku
ołówek, książka ćwiczeń, władca

IFS oznacza wewnętrzny separator pola. Przypisano mu przecinek. Zwróć uwagę na użycie podwójnych cytatów dla $ arr [@] i $ arr [*] w poleceniach echo. Przecinki zostały uwzględnione dla * indeksu indeksowego, a nie dla indeksu @. Jest jeszcze inny problem: w drugiej linii wyjściowej, w której zastosowano przecinki, przestrzenie nie zostały wyświetlone. Więc @ i * nie są synonimami przez cały czas. Cóż, możliwe jest oddzielenie się od przecinka i przestrzeni - patrz poniżej.

Wyświetlanie wszystkich kluczy tablicy asocjacyjnej

Wyrażenie, $ !Nazwa [@] lub $ !Nazwa [*] Zwraca klawisze tablicy jako listę, oddzielone przestrzeniami. Zwróć uwagę na użycie i pozycję znaku wykrzyknika (!). Poniższy kod pokazuje użycie tych wyrażeń:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenie” arr [plastik] = linijka arr [drewno] = ołówek
echo $ !ARR [@]
echo $ !ARR [*]

Wyjście to:

drewniany miękki papierowy plastik
drewniany miękki papierowy plastik

Kolejność kluczy tablicy asocjacyjnej nie musi być taka sama, jak ogłoszona w tablicy.

Liczba elementów tablicy asocjacyjnej

Wyrażenie podaje liczbę elementów ustawionych w tablicy asocjacyjnej, $ #arr [@] lub $ #arr [*], jak pokazano w następującym kodzie:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenie” arr [plastik] = linijka arr [drewno] = ołówek
echo $ #arr [@]
echo $ #arr [*]

Wyjście to:

3
3

Zwróć uwagę na użycie i pozycję symbolu, #.

Wyświetlanie tylko elementów zestawu tablic asocjacyjnych

Kluczowy element przypisany wartość jest ustawiona, podczas gdy ten, który nie jest przypisany wartość, jest niezajemna. Poniższy kod wyświetla tylko ustawione wartości:

Deklaruj -ARR
ARR [Ink] = Pen
$ ARR [Soft Paper]; ARR [miękki papier] = „ćwiczenia”
$ arr [twardy papier]
ARR [plastik] = linijka
$ ARR [Papier specjalny]
ARR [drewno] = ołówek
dla klucza w „$ !arr [@] "; do
printf "$ arr [$ key],"
zrobione
Echo

Wyjście to:

ołówek, książka ćwiczeń, długopis, władca,

Ponownie, pozycjonowanie wyjściowe nie jest w zakodowanej kolejności. Zauważ, że „$ !arr [@] ”jest w podwójnych cytatach, dzięki czemu wartości zawierające przestrzenie można wydrukować. Zauważ, że w $ arr [$ key] klucz jest poprzedzony przez $. Polecenie PrintF jest podobne do polecenia Echo, ale nie dodaje nowego wiersza po wyświetleniu. Możliwe było oddzielenie wartości na wyjściu, przecinkiem i przestrzenią, w jednej linii. Ostatnie echo spowodowałoby przejście następnego wyjścia do następnego wiersza.

Ustawianie i niepokojące elementy tablicy asocjacyjnej i jej tablicy

Każdy kluczowy element, którego nie przypisano wartości, jest niezajemna. Kluczowy element, który ma przypisaną do niego wartość. Teraz element może być celowo nieseet, jak pokazuje następujący skrypt:

Deklaruj -ARR
ARR [miękki papier] = „ćwiczenie” arr [plastik] = linijka arr [drewno] = ołówek
Unset ARR [plastik]
dla klucza w „$ !arr [@] "; do
printf "$ arr [$ key],"
zrobione
Echo

Wyjście to:

ołówek, książka ćwiczeń,

„Władca” nie został wyświetlony. Składnia, aby rozejmować element, wynosi:

Unset ArrayName [klucz]

Składnia w celu usunięcia lub rozstrzygnięcia całej tablicy asocjacyjnej jest:

Unset ArrayName

Lub

Unset ArrayName [@]

Lub

Unset ArrayName [*]

W poniższym kodzie cała tablica jest niezajemna:

Declare -a arr = ([INK] = Pen [miękki papier] = „ćwiczenie” [twardy papier] = "książka tekstowa" [plastik] = linijka [Papier specjalny] = 42 [drewno] = ołówek)
Unset ARR
echo "$ arr [*]"

Wyjście jest niczym (pusta linia), ponieważ cała tablica została nieseksualna.

Wyświetlanie wartości powiązanej tablicy

Wyświetlanie wartości powiązanej tablicy

Declare -a arr = ([INK] = Pen [miękki papier] = „ćwiczenie” [twardy papier] = "książka tekstowa" [plastik] = linijka [Papier specjalny] = 42 [drewno] = ołówek)
Dla wartości w „$ arr [@]”; Do
echo $ wartość
zrobione

Wyjście to:

ołówek
42
ćwiczenia
podręcznik
długopis
linijka

Ponownie, kolejność kodowania wartości w tablicy asocjacyjnej nie musi być kolejnością, w której są wyświetlane. Zauważ, że @ został użyty zamiast * dla zmiennej listy. Ponadto dla zmiennej listy użyto podwójnych cytatów.

Wniosek

Tablica to lista, numerowana lub kluczowa. Gdy tablica jest ponumerowana, jest to tablica indeksowana. Gdy wartości są zlokalizowane według kluczy, jest to tablica asocjacyjna. Z indeksowaną tablicą numerowanie zaczyna się od zera. W obliczeniach tablica musi być zakodowana. Programista musi wiedzieć, jak utworzyć tablicę. Musi wiedzieć, jak dodać elementy do tablicy i usunąć elementy z tablicy. Musi być w stanie określić liczbę elementów w tablicy. I musi wiedzieć, jak usunąć tablicę.