Se você não declarar a variável como uma matriz associativa, então
klang=([string_0]='element_0' [string_1]='element_1' [string_2]='element_2')
é tomado como uma atribuição de matriz normal (embora note que em matrizes bash e ksh93 , normal não são realmente normais arrays, eles são mais matrizes esparsas ou matrizes associativas com chaves limitadas a inteiros positivos).
Em bash , para um array normal , as chaves são avaliadas como expressões aritméticas. Como uma expressão aritmética, string_0 avalia o conteúdo de $string_0 e, se estiver vazio, para 0 . Então, o acima é provável que seja o mesmo que:
klang=([0]='element_0' [0]='element_1' [0]='element_2')
Então, é o mesmo que definir ${klang[0]} (que é igual a $klang ) 3 vezes.
Isso contrasta com ksh93 arrays (que bash copiou principalmente), em que a sintaxe a=([x]=y) é suportada apenas para matrizes associativas e cria automaticamente uma matriz associativa quando usada.
zsh matrizes associativas (que antecedem bash por décadas) são diferentes novamente. zsh normal arrays são arrays normais , zsh não suporta a sintaxe a=([x]=y) do bogus%. Em zsh , você precisa declarar matrizes associativas antes de defini-las e elas são definidas como:
normal_array=(val1 val2 val3)
typset -A associative_array
associative_array=(key1 val1 key2 val2)
associative_array+=(key3 val3...)
E $associative_array gasta para os valores não vazios como para matrizes normais (em ordem indefinida) e "$associative_array[@]}" para todos os valores como para matrizes normais . ${(k)associative_array} para as chaves não vazias , "${(k@)associative_arrays}" para todas as chaves , "${(kv@)associative_array}" para as chaves e valores, para que você possa imprimir o conteúdo de uma associação array com:
printf '%s => %s\n' "${(@kv)associative_array}"
Isso também significa que copiar uma matriz associativa é muito menos complicado do que com ksh93 / bash :
typeset -A B
B=("${(kv@)A}")
ao contrário de:
unset B
typeset -A B
for k in "${!A[@]}"; do B[$k]=${A[$k]}; done