Slovník ve skriptu prostředí zobrazuje pouze poslední přidruženou položku

Snažím se používat slovníky a narazil jsem na divné chování. Když vytvořím takový slovník:

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

Poslední prvek „prd“ bude vytištěn na obrazovku, nikoli na první. Odstranění všech položek kromě první bude mít za následek správný výstup. Nejsem si jistý, co dělám špatně, protože každý příklad kódu, na který jsem se podíval, používá slovníky jako výše. Vidí někdo moji chybu?

Zdravím

Komentáře

  • Jak se vám skript spouští?
  • Spouštím to z bash pomocí binárního sh s kořenovými privy
  • Chová se, jako by servers bylo místo asociativního pole pole. Zkontrolujte překlepy a zkontrolujte, zda je verze bash alespoň 4,0 (první, která podporuje asociativní pole).
  • Používáte sh nebo bash?
  • Jaká je verze bash, který používáte (chová se, jako když používáte verzi bash před 4)?

Odpovědět

Myslím, že komentář @Yurko je správná cesta.

S bash před verzí 4 (například /bin/bash pro Mac):

  1. řádek declare -A vydá chybu (declare: -A: invalid option) a pole je není deklarováno .
  2. druhý řádek vytvoří indexované pole: protože index je vyhodnocen jako aritmetický výraz
  3. v aritmetických výrazech bash: „holá“ slova jsou považována za názvy proměnných; nenastaveným proměnným je dána nulová hodnota

Proto je každý řetězec přiřazen index 0.

Zkuste toto:

 declare -p servers  

a měl by se zobrazit výstup

 declare -a servers="([0]="prd")"  

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *