Pole jsou jednou z nejpoužívanějších a základních datových struktur. Můžete si představit pole jako proměnnou, která v sobě může ukládat více proměnných.
V tomto článku pokryjeme pole Bash a vysvětlíme, jak je používat ve skriptech Bash.
Bash Arrays #
Bash podporuje jednorozměrné numericky indexované a asociativní typy polí. Na číselná pole se odkazuje pomocí celých čísel a na asociativní pomocí řetězců.
K číselně indexovaným polím lze přistupovat od konce pomocí záporných indexů, indexu -1
odkazuje na poslední prvek. Indexy nemusí být souvislé.
Na rozdíl od většiny programovacích jazyků prvky pole Bash nemusí mít stejný datový typ. Můžete vytvořit pole, které obsahuje řetězce i čísla.
Bash nepodporuje vícerozměrná pole a nemůžete mít prvky pole, které jsou také pole.
Neexistuje žádné omezení na maximální počet prvků, které lze uložit do pole.
Vytváření Bash Arrays #
Pole v Bash lze inicializovat různými způsoby.
Vytváření číselně indexovaných polí #
Bash proměnné jsou bez typu, libovolnou proměnnou lze použít jako indexované pole, aniž by bylo nutné ji deklarovat.
Chcete-li explicitně deklarovat pole, použijte deklaraci builtin:
declare -a array_name
Jedním ze způsobů, jak vytvořit indexované pole, je použití následujícího formuláře:
array_name[index_1]=value_1
array_name[index_2]=value_2
array_name[index_n]=value_n
Kde index_*
je kladné celé číslo.
Dalším způsobem, jak vytvořit číselné pole, je zadat seznam prvků v závorkách oddělených prázdným místem:
array_name=( element_1 element_2 element_N )
Když je pole vytvořeno pomocí výše uvedeného formuláře, indexování začíná na nule, tj. první prvek má index 0
.
Vytváření asociativních polí #
Na rozdíl od numericky indexovaných musí být asociativní pole před použitím deklarována.
Chcete-li deklarovat asociativní pole, použijte declare
vestavěný s -A
možnost (velká písmena):
declare -A array_name
Asociativní pole lze vytvořit pomocí následujícího formuláře:
declare -A array_name
array_name[index_foo]=value_foo
array_name[index_bar]=value_bar
array_name[index_xyz]=value_xyz
Kde index_*
může být libovolný řetězec.
Můžete také vytvořit asociativní pole pomocí níže uvedeného formuláře:
declare -A array_name
array_name=(
[index_foo]=value_foo
[index_bar]=value_bar
[index_xyz]=value_xyz
)
Operace pole #
Syntaxe polí Bash může zpočátku vypadat trochu divně, ale bude to dávat větší smysl, až si přečtete tento článek.
Referenční prvky #
Chcete-li odkazovat na jeden prvek, musíte znát index prvku.
Na jakýkoli prvek lze odkazovat pomocí následující syntaxe:
${array_name[index]}
Syntaxe pro přístup k prvku pole je podobná syntaxi většiny programovacích jazyků. Složené závorky ${}
jsou vyžadovány, aby se předešlo operátorům rozšíření názvu souboru.
Vytiskneme prvek s indexem 1
:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print element
echo ${my_array[1]}
Helium
Pokud použijete @
nebo *
jako index se slovo rozšíří na všechny členy pole. Chcete-li vytisknout všechny prvky, které byste použili:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium
Jediný rozdíl mezi @
a *
je, když tvar ${my_array[x]}
je obklopen dvojitými uvozovkami. V tomto případě *
expanduje na jedno slovo, kde jsou prvky pole odděleny mezerou. @
rozšíří každý prvek pole na samostatné slovo. To je zvláště důležité při použití formuláře k negramotnosti prvků pole.
Chcete-li vytisknout klíče pole, přidejte !
operátor před názvem pole:
${!array_name[index]}
Zde je příklad:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${!my_array[@]}"
0 1 2 3
Délka pole #
Chcete-li získat délku pole, použijte následující formulář:
${#array_name[@]}
Syntaxe je stejná jako při odkazování na všechny prvky s přidáním #
znak před názvem pole.## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## array Length
echo ${#my_array[@]}
4
Procházet polem #
Nejběžnějším způsobem iterace přes každou položku v poli je použití cyklu for:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${my_array[@]}"
do
echo "$i"
done
Výše uvedený kód iteruje pole a vytiskne každý prvek na nový řádek:
Hydrogen
Helium
Lithium
Beryllium
Zde je příklad, jak vytisknout všechny klíče a hodnoty:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${!my_array[@]}"
do
echo "$i" "${my_array[$i]}"
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
Dalším způsobem, jak procházet polem, je získat délku pole a použít C style
smyčka:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
# Length of the array
length=${#my_array[@]}
# Array Loop
for (( i=0; i < ${length}; i++ ))
do
echo $i ${my_array[$i]}
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
Přidat nový prvek #
Chcete-li přidat nový prvek do pole bash a zadat jeho index, použijte následující formulář:
my_array[index_n]="New Element"
Zde je příklad:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new element
my_array[9]="Aluminum"
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum
Dalším způsobem přidání nového prvku do pole bez uvedení indexu je použití +=
operátor. Můžete přidat jeden nebo více prvků:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new elements
my_array+=( Cobalt Nickel )
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel
Smazat prvek #
Chcete-li odstranit jeden prvek, musíte znát index prvku. Prvek lze odstranit pomocí unset
příkaz:
unset my_array[index]
Podívejme se na příklad:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## remove element
unset my_array[2]
## print all elements
echo "${my_array[@]}"
Hydrogen Helium Beryllium
Závěr č.
Vysvětlili jsme, jak vytvořit numericky indexovaná a asociativní pole. Také jsme ukázali, jak iterovat pole, vypočítat délku pole a přidat a odebrat prvky.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.