Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Pole

Bash podporuje numericky indexovaná pole, indexuje se od 0. Níže vidíme syntax vytvoření pole a přístupu k jednotlivým prvkům

# vytvoreni pole vyctem
name=(element1 element2 ...)
# vytvoreni pole pomoci explicitni deklarace
declare -a anotherArray

# pristup k prvku na indexu index
${name[index]}

Všechna existující pole lze vypsat pomocí1

foo=(ahoj svete blah)
declare -a

vypíše

[...]
declare -a foo=([0]="ahoj" [1]="svete" [2]="blah")
[...]

Čtenář může experimenty ověřit, že

  • K jednoduché proměnné lze přistupovat jako k poli, hodnota proměnné je na indexu 0, na ostatních indexech je prázdný řetězec; declare -a ovšem jednoduché proměnné nevypisuje.

  • Pole lze vytvořit i přímým vložením hodnoty na nějaký index, tj. např. foo[3]=tri vytvoří pole, které má na indexu 3 hodnotu tri; declare -a vypisuje pouze hodnoty na indexech, ke kterým bylo přistupováno.

Ke všem prvkům pole najednou lze přistoupit pomocí speciálních indexů * nebo @. V případě * je z hodnot vytvořen řetězec, kde jsou hodnoty odděleny pomocí prvního znaku IFS. V případě @ jsou prvky pole odděleny mezerami. Je-li ovšem @ použito v uvozovkách, pamatuje si, že je seznamem položek bez ohledu na oddělovače.

foo=("jedna jj" dva tri)

IFS=:
A=(${foo[*]})
B=(${foo[@]})
C=("${foo[*]}")
D=("${foo[@]}")

declare -a

Vypíšeme

[..]
declare -a A=([0]="jedna jj" [1]="dva" [2]="tri")
declare -a B=([0]="jedna jj" [1]="dva" [2]="tri")
declare -a C=([0]="jedna jj:dva:tri")
declare -a D=([0]="jedna jj" [1]="dva" [2]="tri")
[..]

Na první pohled je záhadný řádek, kde bylo vytvořeno A. Souvisejícím výkladem je podkapitola Dělení slov a IFS. Expanze shellu tady slovo jedna jj:dva:tri rozdělila ve fázi dělení slov pomocí znaků IFS. Pokud je ovšem slovo v uvozovkách, tato expanze se potlačí a projeví se rozdíl, jako v našem příkladu u C a D. Upozorníme také, že pokud provedeme

foo=("jedna jj" dva tri)

# hodnota IFS je defaultni, obsahuje tedy mezeru
A=(${foo[*]})
B=(${foo[@]})

declare -a

dostaneme výše zmíněným expanzním mechanismem

[..]
declare -a A=([0]="jedna" [1]="jj" [2]="dva" [3]="tri")
declare -a B=([0]="jedna" [1]="jj" [2]="dva" [3]="tri")
[..]

To typicky není vyžadováno, v základu tedy doporučuji používat uvozovky.


Lze pracovat i s asociativními poli, kde se indexuje řetězci.

# asociativnimu poli patri prepinac -A u declare
declare -A bar
bar[ahoj]=10
bar[svete]=20

declare -A

s výsledkem

[..]
declare -A bar=([ahoj]="10" [svete]="20" )
[..]

  1. Builtin declare lze použít k deklarování či výpisu proměnných vybraných vlastností, dokumentace help declare. ↩