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]=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[*]}