Toto je druhý článek jako součást bash polí. V předchozím článku jsme probrali, jak pracovat s Indexovanými poli v Bash . V této příručce budeme diskutovat o Bash Associative Array podrobně s příklady v Linuxu.
Asociativní pole fungují na základě párů klíč–hodnota. V některých jazycích se mu také říká slovníky nebo hash mapy . Hlavní rozdíl mezi indexovanými a asociativními poli je v tom, že indexovaná pole fungují na základě hodnoty indexu a každý prvek v poli je mapován na konkrétní pozici indexu pole. Asociativní pole používá "klíč" k mapování hodnoty místo pozic indexu.
Pojďme se ponořit a podívat se, jak používat asociativní pole v bash.
Inicializovat asociativní pole
Na rozdíl od indexovaného pole nemůžete inicializovat asociativní pole bez použití declare
příkaz.
Použijte declare
příkaz s -A
vlajka.
$ declare -A STAR_PLAYERS=()
Nyní prázdné pole s názvem "STAR_PLAYERS" je vytvořen. Pokud chcete, můžete také přidat prvky do pole přímo během inicializace.
$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Kane" )
Ve výše uvedeném kódu jsou klíče v hranatých závorkách a za hodnotami by mělo následovat rovnítko bez mezer. Jako oddělovač mezi prvky není nutné používat čárku nebo středník.
Pro lepší čitelnost můžete zapsat prvky pole na více řádků.
$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Rooney" )
Zobrazit prvky pole
Musíte použít echo
nebo printf
příkaz v bash pro tisk obsahu pole. Podobně jako jsme použili speciální proměnnou *
a @
pro tisk indexovaného pole by se totéž mělo použít i pro tisk asociativních polí.
$ echo ${STAR_PLAYERS[@]}
$ echo ${STAR_PLAYERS[*]}
Mezi *
je významný rozdíl a @
a znát rozdíl mezi *
a @
a jak to funguje s polem, prostudujte si sekci "Opakování prvků pole" v našem Bash For Loop průvodce.
Pokud se pokusíte vytisknout prvky pole bez použití *
nebo @
, výstup bude prázdný.
$ echo ${STAR_PLAYERS}
Pokud se také podíváte na výše uvedený výstup, vytisknou se pouze hodnoty a ne klíče. Hodnoty, které vytisknete, nebudou objednány. Hodnotu konkrétního prvku můžete získat pomocí jeho klíče.
$ echo ${STAR_PLAYERS[Brazil]}
Přidat nové prvky do pole
Přidání nového prvku do pole je jednoduché. Jediné, co musíte udělat, je vytvořit nový pár klíč–hodnota, jak je znázorněno níže.
$ STAR_PLAYERS[Belgium]="Hazard"
$ echo ${STAR_PLAYERS[@]}
Pokud se pokusíte použít stejný klíč, který je již v poli přítomen, hodnota bude přepsána novým.
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}
Přidat nové prvky do pole
Prvky k poli můžete také připojit pomocí následující syntaxe.
$ STAR_PLAYERS+=([Spain]="Ramos")
$ echo ${STAR_PLAYERS[@]}
Vytisknout pár klíče a hodnoty
Z předchozích příkladů jste možná pochopili, že se tisknou pouze hodnoty. Samotný seznam klíčů získáte přidáním předpony "!"
symbol s polem.
$ echo ${!STAR_PLAYERS[@]}
Pokud chcete tisknout klíč i hodnotu současně, můžete použít for loop
.
for elem in "${!STAR_PLAYERS[@]}" do echo "key : ${elem}" -- "value: ${STAR_PLAYERS[${elem}]}" done
Délka asociativního pole
Délku asociativního pole, tj. celkový počet prvků přítomných v poli, můžete získat předponou "#"
symbol s polem. To je běžné i pro indexovaná pole.
$ echo ${#STAR_PLAYERS[@]}
Zkontrolujte, zda je prvek v poli přítomen
Někdy před provedením jakéhokoli zpracování s konkrétním prvkem můžete chtít zkontrolovat, zda je prvek již v poli přítomen. Existuje mnoho způsobů, jak to udělat, ale níže je ten nejjednodušší.
Používám podmíněný příkaz s -n
příznak, který zkontroluje, zda je délka řetězce vrácena z ${STAR_PLAYERS[Argentina]}
je nenulový. Rozbalí daný klíč a hodnota je ve skutečnosti porovnána s -n
vlajka.
if [[ -n "${STAR_PLAYERS[Argentina]}" ]] then echo "Element is present" else echo "Element not present" fi
Asociativní pole pouze pro čtení
Asociativní pole můžete vytvořit pouze pro čtení. Ve stavu jen pro čtení, jakmile je pole inicializováno, nemůžete do pole přidávat nové prvky ani upravovat žádné hodnoty v poli. Spolu s declare
musíte použít -r
vlajka.
$ declare -r -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Rooney" )
$ STAR_PLAYERS[Spain]="Ramos"
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}
Odebrat prvky
Pokud chcete z pole odstranit jakýkoli konkrétní prvek, můžete použít unset
příkaz s názvem klíče prvku. Například, pokud chci odstranit prvek (Spain="Ramos"
), pak by syntaxe měla být následující.
$ unset STAR_PLAYERS[Spain]
Vyprázdněte pole
Můžete také odstranit všechny prvky z pole a nechat je prázdné reinicializací pole, jak je znázorněno níže.
$ echo ${STAR_PLAYERS[@]}
$ declare -A STAR_PLAYERS=()
Odstranit pole
Pokud chcete pole odstranit, můžete použít název pole bez jakýchkoli klíčů.
$ unset STAR_PLAYERS
Závěr
V tomto článku jsme viděli, co jsou asociativní pole v bash a některé jeho funkce. Nevýhodou bash je, že musíte buď napsat nějakou logiku ručně, nebo použít externí nástroje k dosažení požadovaného výsledku. Když například musím převést asociativní pole na objekty json, musím použít jq nástroj, který není vestavěný do bash. Zde byste měli zkusit použít Python, který nabízí snadno použitelné metody, když musíte pracovat s poli a jinými datovými strukturami.
Související čtení:
- Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady
- Bash Scripting – pro smyčku vysvětlenou s příklady
- Bash Scripting – funkce vysvětlené na příkladech
- Bash Scripting – proměnné vysvětlené na příkladech
- Přesměrování Bash vysvětleno na příkladech
- Příkaz Bash Echo vysvětlený s příklady v Linuxu
- Výukový program Bash Heredoc pro začátečníky