GNU/Linux >> Tutoriels Linux >  >> Linux

Tableaux associatifs dans les scripts shell ?

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 ?
Linux
  1. Autoriser Setuid sur les scripts Shell ?

  2. Tableaux dans Unix Bourne Shell ?

  3. Exécuter des scripts Shell via un site Web ?

  4. Masquer le mot de passe dans les scripts shell ?

  5. Extensions de fichiers pour les scripts shell Unix ?

Comment créer des scripts shell

Tableaux dans les scripts shell

Comment utiliser if-else dans les scripts shell ?

Comprendre la boucle for dans les scripts shell

La boucle while dans les scripts shell

Paramètres de ligne de commande dans les scripts shell