Dicionário em script de shell mostrando apenas o último item associado

Estou tentando usar dicionários e deparei com um comportamento estranho. Quando eu crio um dicionário como este:

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

O último elemento “prd” será impresso na tela, não o primeiro. Excluir todas as entradas, exceto a primeira, resultará na saída correta. Não tenho certeza do que estou fazendo de errado porque todos os exemplos de código que dei uma olhada estão usando dicionários como acima. Alguém consegue identificar meu erro?

Saudações

Comentários

  • Como você está executando o script?
  • Estou executando-o a partir do bash usando sh binário com privs root
  • Ele se comporta como se servers fosse um array em vez de um array associativo. Verifique se há erros de digitação e se a versão do bash é pelo menos 4.0 (a primeira a oferecer suporte a matrizes associativas).
  • Você está usando sh ou bash?
  • Qual é a versão do bash você usa (se comporta como se você usasse uma versão do bash anterior a 4)?

Resposta

Acho que o comentário de @Yurko é o caminho certo.

Com o bash anterior à versão 4 (como /bin/bash em um Mac):

  1. a linha declare -A emitirá um erro (declare: -A: invalid option) e a matriz é não declarado .
  2. a 2ª linha criará uma matriz indexada : já que o índice é avaliado como uma expressão aritmética
  3. em expressões aritméticas bash: palavras “nuas” são tratadas como nomes de variáveis; e variáveis não definidas recebem o valor zero

Portanto, cada string é atribuída a o índice 0.

Tente isto:

declare -p servers

e você deve ver a saída

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *