Erro de substituição incorreto no shell zsh

2

Olá, na minha pergunta anterior Eu tenho clareza sobre como usar matrizes associativas no shell zsh.

Mas sempre que eu disparo no seguinte comando no meu script

for KEY in ${!array[@]} para iterar entre as chaves na minha matriz

Eu recebo um erro bad substitution .

mesmo echo ${!array[@]} dá o mesmo.

NB: array é o nome do meu array associativo

    
por Munai Das Udasin 13.08.2014 / 12:04

3 respostas

7

zsh tem substituição de parâmetro diferente do Bash, que está documentado em man zshexpn . Ele suporta uma variedade de modificadores para o comportamento de expansão , que são colocados entre parênteses antes o nome da variável: ${(X)name} . O modificador para incluir chaves de matriz (incluindo matrizes associativas) é k : ${(k)array} expande para a lista de chaves na matriz, exceto que se uma chave for a cadeia vazia, ela será omitida. Use aspas duplas e o modificador @ para manter a chave vazia.

for x in "${(@k)array}" ; ...

fará um loop pelas chaves da matriz array .

    
por 13.08.2014 / 12:11
4

Você deve usar "${(@k)array}" , "${(k)array}" apenas se expande para as chaves não vazias:

typeset -A array
array=(k1 v1 k2 v2 k3 v3)

for k in "${(@k)array}"; do
  printf "%s -> %s\n" "$k" "$array[$k]"
done

Então:

$ zsh test.zsh 
k1 -> v1
k2 -> v2
k3 -> v3

Você também pode substituir for loop por key, expansão de valor:

printf '%s -> %s\n' "${(@kv)array}"
    
por 13.08.2014 / 12:30
2

AFAIK, ${!...} não existe. Suponho que você queira: ${(k)array[@]} ou simplesmente ${(k)array} . Para obter mais informações, consulte a página zshexpn(1) man, que diz que para o sinalizador de expansão k : "Se nome se referir a uma matriz associativa, substitua as chaves (nomes de elementos) em vez dos valores dos elementos".

    
por 13.08.2014 / 12:09

Tags