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:
Table of Contents
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.