60.10. Pole proměnných

Obrázek 60.1. Pole ve zkratce

$ declare -a kamaradi
$ kamaradi=([1]=Karel Tomáš Pavel Hanka)
$ echo ${kamaradi[2]}  #=> Tomáš
$ echo ${kamaradi[*]}  #=> Karel Tomáš …
$ echo ${#kamaradi[*]} #=> 4 (počet prvků)
$ echo ${!kamaradi[*]} #=> 1 2 3 4 (seznam indexů)

V Bashi máme k dispozici jednorozměrná pole. Pole nemusíme deklarovat, můžeme jej rovnou použít. Pokud jej chceme deklarovat, což doporučuji, můžem tak učinit příkazem declare.

declare -a name
declare -a name[subscript]

Obě varianty zápisu jsou ekvivalentní. Případné informace o indexu v hranatých závorkách jak je vidět na druhém řádku bash ignoruje.

$ declare -a mojePole

Přiřazení hodnoty do pole se provede jednoduše podobně jako přiřazení do proměnné.

pole[index]=hodnota

pole[index]=hodnota

Jako index můžeme použít libovolná celá čísla, tedy i čísla záporná. Velikost pole není nijak omezena. Pokud nastavíme vlastnosti pole, například jen pro čtení readonly mojePole, je tato vlastnost vztažena ke všem prvkům pole.

$ declare -a vysledky
$ vysledky[1]=dobry
$ vysledky[2]=spatny
$ vysledky[3]=pokus
bash: vysledky: readonly variable
$ vysledky[1]=vyjimecny
bash: vysledky: readonly variable

Do pole nemusíme zapisovat hodnoty postupně, můžeme je zapsat jedním příkazem přiřazení.

pole=([index1]=hodnota1  [index2]=hodnota2  …  [indexn]=hodnotan)

Poznámka

Povšiměte si, že jednotlivé hodnoty jsou oddělovány mezerami a nikoliv čárkami.

Část [index1]= je nepovinná. Můžeme tedy psát:

$ mojePole=([1]=a b c)
# nebo
$ mojePole=(a b c)

Přiřazení probíhá tak, že jednotlivé hodnoty v závorce jsou postupně z leva do prava přiřazovány indexům pole. Pokud není index definován, použije se index o jedničku větší než se použil u předchozí hodnoty. U první hodnoty, pokud nebyl rovněž definován, se použije index 0. Tento jednoduchý postup může přepsat právě přiřazenou hodnotu například:

$ mojePole=([2]=a [1]=b c)

hodnota c se zapíše do indexu 2, čímž přepíše hodnotu a. Příkaz je tedy ekvivalentní příkazu.

$ mojePole=([1]=b [2]=c)

Poznámka

Připomínám že toto hromadné přiřazení do pole přepíše/odstraní všechny předchozí prvky pole.

Přístup k jednotlivým prvkům pole zajistí zápis

${jméno[index]}

>$ mojePole=(jablko hruska svestka)
$ echo ${mojePole[2]}
svestka

Na místě indexu můžeme použít speciální symobly @ a *. v takovém případ je výsledkem seznam všech prvků pole. Rozdíl mezi @ a * je jen v případě že je celý výraz uzavřen závorkami. Rozdíl je stejný jako pří použítí $* a $@ proměnných.

$ kamaradi=(Pavel Karel Tomáš)
$ echo ${kamaradi[*]}
Pavel Karel Tomáš

Ze speciálních zápisů bych dále zmínil zápis který vrací délku hodnoty v prvku pole. Tedy její počet znaků.

${#pole[1]}

Obdobný zápis s použitím * jako indexu vrací celkový počet prvků pole.

$ echo ${#kamaradi[*]}
3

Seznam obsazených indexů pole, tedy těch čísel kterým je přiřazena hodnota získáme zápisem.

${!pole[*]}
${!pole[@]}

$ echo ${!kamaradi[*]}