Průvodce Bash Arrays

V této příručce o polích Bash se dozvíte, jak deklarovat indexovaná a asociativní pole v Bash a pracovat s nimi.

V Bash můžete vytvořit pole pro uložení kolekce prvků. Pole Bash jsou jednorozměrné kolekce. V programovacích jazycích, jako je C a C++, jsou pole kolekce prvků stejného datového typu. V Bash však můžete v závislosti na případu použití ukládat celá čísla a řetězce do stejného pole.

V tomto tutoriálu se naučíte, jak deklarovat pole Bash a přistupovat k jeho prvkům. Poté se naučíte, jak procházet prvky pole a připojovat prvky k poli. Nakonec se dozvíte o asociativních polích v Bash.

Pojďme začít!

⚙ Máte zájem o kódování? Zde jsou předpoklady:

Jak deklarovat pole Bash

V této části se naučíte syntaxi pro deklaraci pole Bash a příklady kódu.

Syntaxe deklarace pole Bash

Pole můžete deklarovat v Bash pomocí následující syntaxe:

$ arrayName=(elt1 elt2 ... eltN)

# arrayName is the name of the array
# elt1 through eltN are the N elements in the array

Ve výše uvedené syntaxi poleName označuje název pole, které obsahuje N prvků elt1…eltN.

Prvky pole jsou uzavřeny mezi úvodní a závěrečnou závorkou (). Všimněte si také, že prvky pole jsou odděleny mezerou. Stejně jako u jakékoli proměnné Bash by před nebo za operátorem přiřazení = neměly být žádné mezery.

📑 Ve většině ostatních programovacích jazyků oddělujete prvky pole nebo podobných kolekcí čárkami. Ale v Bash jsou oddělovačem mezery.

V Bash se taková pole, ve kterých jsou prvky identifikovány svým indexem, označují jako indexované pole.

Deklarace indexovaných polí v Bash

Vytvořme ceny, pole čísel.

$ prices=(24 27 18 30 15)

Jak je uvedeno v syntaxi, čísla v poli cen jsou oddělena mezerou uzavřenou v závorkách bez mezer před a za operátorem přiřazení =.

V Bash můžete použít příkaz echo k vytištění hodnoty proměnné. Použití $variableName vytiskne hodnotu variableName. Můžete však vidět, že pomocí názvu pole se vytiskne pouze první prvek.

$ echo $prices
24

Pole Bash sledují nulové indexování. Takže první prvek je na indexu 0, druhý prvek je na indexu 1 a tak dále. Můžete také použít negativní indexování; index posledního prvku pole je -1.

Co se stane, když se pokusíte o přístup k prvku na konkrétním indexu a vytisknete jej? Zkusme vytisknout prvek na indexu 1.

$ echo $prices[1]
24[1]

Proč je výstup 24[1]? 🤔 Je to proto, že Bash nahrazuje ceny $ 24, prvním prvkem v poli a [1] je vytištěna jako taková.

Chcete-li vytisknout prvek na konkrétním indexu, můžete použít rozšíření parametru ve tvaru ${ceny[index]}.

$ echo ${prices[1]}
# 27
$ echo ${prices[2]}
# 18

Chcete-li vytisknout všechny prvky v poli, můžete místo konkrétního indexu zadat @.

$ echo ${prices[@]}
24 27 18 30 15

Dále vytvoříme pole řetězců. Spuštěním následujícího příkazu se vytvoří indexované pole:

$ declare -a fruits

Volba -a vytvoří indexované pole. Nyní můžete pole naplnit, jeden prvek po druhém, deklarováním prvku na konkrétním indexu, jak je znázorněno níže:

$ fruits[0]="cherry"
$ fruits[1]="berry"
$ fruits[2]="apple"
$ fruits[3]="pear"
$ fruits[4]="melon"
$ fruits[5]="orange"

Nyní můžete k vytištění všech prvků pole použít ${fruits[@]}.

$ echo ${fruits[@]}
cherry berry apple pear melon orange

Získejte přístup k prvkům pole Bash

K prvkům pole můžete přistupovat následujícími způsoby:

  • Projděte pole a získejte přímý přístup k prvku
  • Procházejte sadu indexů a přístupových prvků na konkrétním indexu

Smyčka přes pole a přístupové prvky

Pokud jste kódovali v Pythonu, použili jste cyklus for pomocí následující syntaxe:

for elt in some_list:
    print(elt)

Nyní napíšeme ekvivalent Bash výše uvedenému cyklu for.

Víme, že {ceny[@]} se rozšíří na všechny prvky v poli cen. A ${ceny[@]} nám dává hodnoty všech prvků.

Cyklus Bash for je podobný syntaxi cyklu for Pythonu, ale příkazy v těle cyklu by měly být uzavřeny v do a done, jak je znázorněno:

$ for price in ${prices[@]}
> do
> echo $price
> done

Protože použijeme příkaz echo a vytiskneme hodnotu proměnné ceny, dostaneme následující výstup:

# output
24
27
18
30
15

Přístup k prvkům pomocí indexu pole

Dalším způsobem procházení polí je použití indexu prvků. Je to podobné jako konstrukce cyklu for v Pythonu používá funkci range():

for i in range(len(some_list)):
    print(i)

Chcete-li získat seznam indexů pro procházení, můžete před název pole v rozšíření parametru umístit vykřičník (!). Tím získáte seznam všech platných indexů pro pole, jak je znázorněno:

$ echo ${!prices[@]}
0 1 2 3 4

Pole cen obsahuje 5 prvků, takže index začíná na 0 a jde nahoru na 4.

Dále můžeme procházet seznam indexů a přistupovat k prvku na každém indexu. Pro index i ${prices[i]} je prvek na indexu i.

$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done

Výše uvedená smyčka vytiskne všechny prvky v poli.

# output
24
27
18
30
15

💬 Zde po přístupu ke každému prvku provedeme jednoduchou operaci vytištění jeho hodnoty. Obecně můžeme mít na prvcích jakékoli platné zpracování.

Připojit prvky do pole Bash

V poli cen máme pět prvků (u indexů 0,1,2,3 a 4). Pokud chcete přidat prvek na konec pole na indexu 5, můžete tak učinit následovně:

$ prices[5]=21

Vidíme, že 21 bylo připojeno na konec pole cen.

$ echo ${prices[@]}
24 27 18 30 15 21

Je však pohodlnější připojit na konec pole – bez zapamatování – index posledního přidaného prvku nebo počet prvků aktuálně v poli.

Můžete použít arrayName+=(elements(s)) it k připojení jednoho nebo více prvků k poli, jak je znázorněno:

$ prices+=(10)

Nyní, když vytiskneme pole cen, uvidíme, že na konec pole bylo připojeno 10.

$ echo ${prices[@]}
24 27 18 30 15 21 10

Dále se naučíme, jak deklarovat asociativní pole v Bash.

Asociativní pole v Bash

Pokud chcete definovat vztah z hlediska párů klíč-hodnota, můžete použít asociativní pole. Asociativní pole můžete deklarovat pomocí následující obecné syntaxe. Všimněte si, že místo -a používáme volbu -A.

$ declare -A fruits_prices

Prvky do asociativního pole můžete přidat zadáním klíče a odpovídající hodnoty. Zde jsme přidali názvy ovoce jako klíče a čísla z pole cen jako hodnoty.

$ fruits_prices[cherry]=24
$ fruits_prices[berry]=27
$ fruits_prices[apple]=18
$ fruits_prices[pear]=30
$ fruits_prices[melon]=15
$ fruits_prices[orange]=21

Jak tedy přistupujeme k prvkům v asociativním poli?

Stejně jako byste vyhledávali hodnotu pomocí odpovídajícího klíče ve slovníku Pythonu, můžete pomocí klíčů přistupovat k hodnotám v asociativním poli.

$ echo ${fruits_prices[berry]}
# 27

Vidíme, že ${fruits_prices[@]} expanduje na hodnoty a ${!fruits_prices[@]} se rozšíří na klávesy.

$ echo ${fruits_prices[@]}
# Output: 18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# Output: apple berry orange cherry pear melon

Poznámka: Pořadí prvků není stejné jako pořadí, ve kterém jsme je přidali. Důvodem je, že na rozdíl od indexovaných polí nejsou asociativní pole uspořádanými kolekcemi. Spíše pracují na asociaci mezi klíči a hodnotami. Proto jsou klíče pro asociativní pole tím, čím jsou indexy pro indexová pole.

Můžete také procházet asociativním polem a přistupovat ke klíčům, jak je znázorněno:

$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# Output
apple
berry
orange
cherry
pear
melon

Následující smyčka ukazuje, jak můžete k hodnotám přistupovat.

$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# Output
18
27
21
24
30
15

I když se doporučuje použít arrayName[key]=hodnota, můžete ji také deklarovat jako sekvenci takto:

declare -A arrayName
arrayName=(key1 value1 key2 value2 ... keyN valueN)

Tímto způsobem Bash odvodí první prvek jako první klíč, druhý prvek jako první hodnotu a tak dále.

Shrnutí

Doufám, že nyní rozumíte tomu, jak vytvářet pole Bash a pracovat s nimi. Zde je rychlý přehled toho, co jste se naučili.

  • Indexované pole můžete deklarovat v Bash pomocí syntaxe název_pole=(elt1 elt2 elt3 … eltN) nebo spustit příkaz deklarovat -a název_pole a přidat prvky do pole.
  • Pro přístup k prvkům můžete procházet pomocí ${arrayName[@]}. Alternativně můžete získat seznam všech platných indexů pomocí rozšíření parametru ${!arrayName[@]}.
  • Nakonec jste se také naučili, jak deklarovat asociativní pole pro ukládání párů klíč–hodnota v Bash.

Dále se podívejte na tutoriál pro smyčky v Bash.