Le problème de base ici est que le (s) développeur (s) de bash qui a conçu / implémenté des tableaux ont vraiment vissé le chien. Ils ont décidé que ${array}
c'était juste une main courte ${array[0]}
, ce qui était une grave erreur. Surtout lorsque vous considérez que cela ${array[0]}
n'a pas de sens et que vous évaluez la chaîne vide si le type de tableau est associatif.
L'affectation d'un tableau prend la forme array=(value1 ... valueN)
où value a la syntaxe [subscript]=string
, affectant ainsi une valeur directement à un index particulier du tableau. Cela fait qu'il peut y avoir deux types de tableaux, indexés numériquement et indexés par hachage (appelés tableaux associatifs en langage bash). Cela permet également de créer des tableaux à indexation numérique clairsemés. Laisser la [subscript]=
partie est abrégé pour un tableau indexé numériquement, en commençant par l'indice ordinal de 0 et en incrémentant à chaque nouvelle valeur dans l'instruction d'affectation.
Par conséquent, ${array}
devrait évaluer le tableau entier , les index et tout. Il doit être évalué à l'inverse de l'instruction d'affectation. Toute majeure de troisième année en CS devrait le savoir. Dans ce cas, ce code fonctionnerait exactement comme vous pouvez vous y attendre:
declare -A foo bar
foo=${bar}
Ensuite, passer des tableaux par valeur aux fonctions et assigner un tableau à un autre fonctionnerait comme le reste de la syntaxe du shell. Mais comme ils n'ont pas fait cela correctement, l'opérateur d'affectation =
ne fonctionne pas pour les tableaux, et les tableaux ne peuvent pas être passés par valeur à des fonctions ou à des sous-shell ou à une sortie en général ( echo ${array}
) sans code pour tout mâcher.
Donc, si cela avait été fait correctement, l'exemple suivant montrerait comment l'utilité des tableaux dans bash pourrait être nettement meilleure:
simple=(first=one second=2 third=3)
echo ${simple}
la sortie résultante doit être:
(first=one second=2 third=3)
Ensuite, les tableaux pourraient utiliser l'opérateur d'affectation et être passés par valeur aux fonctions et même à d'autres scripts shell. Facilement stocké en sortant dans un fichier, et facilement chargé d'un fichier dans un script.
declare -A foo
read foo <file
Hélas, nous avons été déçus par une équipe de développement de bash par ailleurs superlative.
En tant que tel, pour passer un tableau à une fonction, il n'y a vraiment qu'une seule option, et c'est d'utiliser la fonctionnalité nameref:
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH
entraînera la sortie suivante:
indexes: foo zoom
values: bar fast
Comme cela passe par référence, vous pouvez également attribuer au tableau dans la fonction. Oui, le tableau référencé doit avoir une portée globale, mais cela ne devrait pas être trop gros, étant donné qu'il s'agit d'un script shell. Pour passer un tableau indexé associatif ou clairsemé par valeur à une fonction, il faut lancer tous les index et les valeurs sur la liste d'arguments (pas trop utile s'il s'agit d'un grand tableau) sous forme de chaînes simples comme celle-ci:
funky "${!array[*]}" "${array[*]}"
puis écrire un tas de code à l'intérieur de la fonction pour réassembler le tableau.