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 mojePolePř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]=pokusbash: vysledky: readonly variable$vysledky[1]=vyjimecnybash: 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)
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)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[*]}