J'ai vu une astuce pour implémenter des tableaux associatifs dans un script shell. Par exemple, print array["apples"]
pourrait être scripté comme echo \$array$key
où clé = pommes.
Cependant, il n'y avait aucune mention de la façon de générer les clés pour itérer sur le tableau. La seule façon dont je pouvais penser était de stocker les clés dans une variable délimitée par des espaces afin que je puisse utiliser une boucle for pour parcourir le tableau.
Alors, existe-t-il un autre moyen de stocker les clés pour une utilisation ultérieure?
shell-script
associative-array
Intellectuel
la source
la source
Réponses:
Coques avec tableaux associatifs
Certains shells modernes fournissent des tableaux associatifs: ksh93, bash ≥4, zsh. Dans ksh93 et bash, si
a
est un tableau associatif, alors"${!a[@]}"
est le tableau de ses clés:Dans zsh, cette syntaxe ne fonctionne qu'en mode d'émulation ksh. Sinon, vous devez utiliser la syntaxe native de zsh:
${(k)a}
fonctionne également sia
n'a pas de clé vide.Dans zsh, vous pouvez également faire une boucle sur
k
eys etv
alues en même temps:Coques sans tableaux associatifs
Émuler des tableaux associatifs dans des shells qui n'en ont pas représente beaucoup plus de travail. Si vous avez besoin de tableaux associatifs, il est probablement temps d'apporter un outil plus gros, tel que ksh93 ou Perl.
Si vous avez besoin de tableaux associatifs dans un simple shell POSIX, voici un moyen de les simuler, lorsque les clés sont restreintes pour ne contenir que les caractères
0-9A-Z_a-z
(chiffres ASCII, lettres et tiret bas). Dans cette hypothèse, les clés peuvent être utilisées dans le cadre des noms de variables. Les fonctions ci-dessous agissent sur un tableau identifié par un préfixe de dénomination, la «tige», qui ne doit pas contenir deux traits de soulignement consécutifs.(Avertissement, code non testé. La détection d'erreurs pour les clés et les clés syntaxiquement invalides n'est pas fournie.)
la source
Je ne sais pas ce que vous entendez par magasin, mais vous pouvez parcourir les clés en utilisant la
${!array[@]}
syntaxe:Donc, pour répéter:
J'ai trouvé un joli petit tutoriel à ce sujet ici .
Comme indiqué dans les commentaires ci-dessous, des tableaux associatifs ont été ajoutés dans la
bash
version 4. Voir ici pour un article de journal Linux sur le sujet.la source
(bash version 4 only)
C'est une chose importante à noter. Traditionnellement, lesbash
tableaux sont uniquement numériques.typeset
au lieu dedeclare
dans vos exemples. Cela les rendrait portables entre bash 4 et ksh93 qui ont d'abord implémenté des tableaux associatifs shell.Coques sans tableaux associatifs
Ce n'est pas si difficile lorsque les touches sont restreintes à
[0-9A-Za-z_]
(chiffres, lettres, trait de soulignement).L'astuce consiste au lieu de stocker dans le tableau [ $ key ], de stocker dans les variables array_ $ key .
Ensemble:
Avoir:
Remarque: Les valeurs ne peuvent pas contenir
'
(guillemet simple).la source
cela fonctionne en bash
OU
Pas besoin d'utiliser eval afaik
la source