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 -aovš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]=trivytvoří pole, které má na indexu 3 hodnotutri;declare -avypisuje 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" )
[..]
-
Builtin
declarelze použít k deklarování či výpisu proměnných vybraných vlastností, dokumentacehelp declare. ↩