Eu vi um truque para implementar matrizes associativas em um script de shell. Por exemplo, print array["apples"]
pode ser script como echo \$array$key
onde key = maçãs.
No entanto, não houve menção de como gerar as chaves para iterar sobre a matriz. A única maneira de pensar era em armazenar as chaves em uma variável delimitada por espaços, para que eu pudesse usar um loop for para iterar sobre a matriz.
Então, existe alguma outra maneira de armazenar as chaves para uso posterior?
shell-script
associative-array
EggHead
fonte
fonte
Respostas:
Conchas com matrizes associativas
Alguns shells modernos fornecem matrizes associativas: ksh93, bash ≥4, zsh. No ksh93 e no bash, se
a
for uma matriz associativa,"${!a[@]}"
é a matriz de suas chaves:No zsh, essa sintaxe funciona apenas no modo de emulação ksh. Caso contrário, você precisará usar a sintaxe nativa do zsh:
${(k)a}
também funciona sea
não tiver uma chave vazia.No zsh, você também pode fazer o loop em
k
eys ev
alues ao mesmo tempo:Cascas sem matrizes associativas
Emular matrizes associativas em conchas que não as possuem é muito mais trabalhoso. Se você precisar de matrizes associativas, provavelmente é hora de trazer uma ferramenta maior, como ksh93 ou Perl.
Se você precisar de matrizes associativas em um mero shell POSIX, aqui está uma maneira de simulá-las, quando as chaves são restritas para conter apenas os caracteres
0-9A-Z_a-z
(dígitos ASCII, letras e sublinhado). Sob essa suposição, as chaves podem ser usadas como parte dos nomes de variáveis. As funções abaixo atuam em uma matriz identificada por um prefixo de nomenclatura, o "tronco", que não deve conter dois sublinhados consecutivos.(Aviso, código não testado. A detecção de erros para hastes e chaves sintaticamente inválidas não é fornecida.)
fonte
Não sei ao certo o que você quer dizer com loja, mas é possível iterar nas chaves usando a
${!array[@]}
sintaxe:Então, para iterar:
Encontrei um tutorial breve e agradável sobre isso aqui .
Conforme apontado nos comentários abaixo, matrizes associativas foram adicionadas na
bash
versão 4. Veja aqui um artigo de jornal do Linux sobre o assunto.fonte
(bash version 4 only)
Isso é uma coisa importante a ser observada. Tradicionalmente, asbash
matrizes são apenas numéricas.typeset
vez dedeclare
nos seus exemplos. Isso os tornaria portáveis entre o bash 4 e o ksh93, que primeiro implementou matrizes associativas de shell.Cascas sem matrizes associativas
Não é tão difícil quando as teclas são restritas a
[0-9A-Za-z_]
(números, letras, sublinhado).O truque é, em vez de armazenar na matriz [ $ key ], armazenar nas variáveis array_ $ key .
Conjunto:
Obter:
Nota: Os valores não podem conter
'
(aspas simples).fonte
isso funciona no bash
OU
Não há necessidade de usar eval afaik
fonte