GNU/Linux >> Znalost Linux >  >> Linux

Bash Scripting – Asociativní pole vysvětleno s příklady

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

Linux
  1. Bash pole s příklady

  2. Bash If-Else prohlášení s příklady

  3. Výukový program Ultimate Bash Array s 15 příklady

  1. Jak napsat Bash skript s příklady

  2. Bash HereDoc výukový program s příklady

  3. Pole AWK vysvětleno na 5 praktických příkladech

  1. Asociativní pole v Bash

  2. Příkaz Bash Echo vysvětlený s příklady v Linuxu

  3. Bash přesměrování vysvětleno s příklady