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 à laquelle 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 itérer sur le tableau.
Alors, existe-t-il un autre moyen de stocker les clés pour une utilisation ultérieure ?
Réponse acceptée :
Shells 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 :
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Dans zsh, cette syntaxe ne fonctionne qu'en mode d'émulation ksh. Sinon, vous devez utiliser la syntaxe native de zsh :
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
fonctionne aussi si a
n'a pas de clé vide.
Dans zsh, vous pouvez également boucler sur les deux k
yeux et v
aleurs en même temps :
for k v ("${(@kv)a}") echo "$k -> $v"
Shells sans tableaux associatifs
L'émulation de tableaux associatifs dans des shells qui n'en ont pas demande beaucoup plus de travail. Si vous avez besoin de tableaux associatifs, il est probablement temps d'utiliser un outil plus puissant, 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 limitées pour contenir uniquement les caractères 0-9A-Z_a-z
(chiffres ASCII, lettres et trait de soulignement). 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 nommage, le "stem", qui ne doit pas contenir deux traits de soulignement consécutifs.
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo "$__aa__${1}""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case $__aa__${1} in
*" $2 "*) $3=$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=$3
case $__aa__${1} in
*" $2 "*) :;;
*) __aa__${1}="${__aa__${1}}$2 ";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case $__aa__${1} in
*" $2 "*) __aa__${1}="${__aa__${1}%%* $2 } ${__aa__${1}#* $2 }";;
esac"
}
(Attention, code non testé. La détection d'erreurs pour les tiges et les clés syntaxiquement invalides n'est pas fournie.)
Connexe :Linux – support lent – réglage du cache disque ?