La page de manuel Bash décrit l'utilisation de ${!a}
pour renvoyer le contenu de la variable dont le nom est le contenu de a
(un niveau d'indirection).
Je voudrais savoir comment retourner tous les éléments d'un tableau à l'aide de ceci, c'est-à-dire
a=(one two three)
echo ${a[*]}
Retour
one two three
Je voudrais pour:
b=a
echo ${!b[*]}
pour retourner le même. Malheureusement, ce n'est pas le cas, mais revient à la 0
place.
Mise à jour
Compte tenu des réponses, je me rends compte maintenant que mon exemple était trop simple, car bien sûr, quelque chose comme:
b=("${a[@]}")
Réalisera exactement ce dont j'avais besoin.
Alors, voici ce que j'essayais de faire:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Bien sûr, une lecture attentive de la page de manuel de Bash montre que cela ne fonctionnera pas comme prévu car la dernière ligne renvoie simplement les indices du "tableau" $_LIST
(pas du tout un tableau).
Dans tous les cas, ce qui suit devrait faire le travail (comme indiqué):
LIST=($(eval echo \${$_LIST[*]}))
ou ... (l'itinéraire que j'ai suivi, finalement):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
En supposant, bien sûr, que les éléments ne contiennent pas d'espace.
[@]
au pointeur_LIST="LIST_${whichone}[@]"
, puis utilisezLIST=("${!_LIST}")
pour copier le tableau. C'est une bonne idée d'utiliser des noms de variable en minuscule pour éviter les conflits avec les variables d'environnement (toutes majuscules).Réponses:
Je pense que l'utilisation de la référence indirecte de la variable bash doit être traitée littéralement.
Par exemple. Pour votre exemple original:
Pour le dernier vrai scénario, je crois que le code ci-dessous ferait le travail.
Il est préférable d'utiliser une notation
"${var[@]}"
qui évite de perturber l'$IFS
expansion des paramètres et. Voici le code final.la source
Vous devez copier les éléments explicitement. Pour un tableau indexé:
Pour un tableau associatif (notez que
a
c'est le nom de la variable du tableau, pas une variable dont la valeur est le nom d'une variable du tableau):Si vous avez le nom de variable dans un tableau, vous pouvez utiliser la méthode élément par élément avec une étape supplémentaire pour récupérer les clés.
(Attention, le code de cet article a été tapé directement dans un navigateur et n'a pas été testé.)
la source
\${!$name[@]}
sur la première ligne, de sorte que la première extension ne soit que de «$ name» et que le${!a[@]}
soit enregistré pour l'eval, et la même chose dans la boucle for, avec\${$name}
. Les deux autres barres obliques inverses avant «$ k» n'y sont pas strictement nécessaires non plus.${!b[*]}
se développe aux indices utilisés dans le tableaub
.Ce que vous voulez doit être fait en deux étapes, donc
eval
vous aidera:eval echo \${$b[*]}
. (Notez le\
qui garantit que le premier$
passera la première étape, l'expansion variable, et ne sera développé qu'à la deuxième étapeeval
.)Selon le paramètre Expansion
!
est utilisé à la fois pour l'expansion indirecte ({!a}
), les noms correspondant au préfixe (${!a*}
) et la liste des clés du tableau (${!a[*]}
). Étant donné que la liste des clés de tableau a la même syntaxe que votre expansion indirecte + expansion d'élément de tableau, celle-ci n'est pas prise en charge telle quelle.la source
${!a}
étend à la valeur de la variable dont le nom est$a
. Ceci est assez sommairement décrit dans le manuel, dans le paragraphe qui commence par "Si le premier caractère du paramètre est un point d'exclamation (!
), un niveau d'indirection variable est introduit."${!
c'est un peu ambigu car si c'est un tableau avec lequel vous avez affaire, le comportement est différent.Pour accéder indirectement aux tableaux, il suffit d'ajouter
[@]
à la variable indirecteb=a[@]
.Si ces variables sont définies:
Ensuite, cela fonctionnera:
Ou simplement:
Un tel tableau pourrait être copié comme ceci:
Et puis imprimé avec:
Dans un script:
Bien sûr, tout ce qui précède copiera un tableau non clairsemé. Un dans lequel tous les index ont une valeur.
tableaux clairsemés
Un tableau clairsemé est un tableau qui peut avoir des éléments non définis.
Par exemple,
a[8]=1234
définit un élément et, en bash, 0 à 7 n'existent pas.Pour copier un tel tableau clairsemé, utilisez cette méthode
Imprimez l'ancien tableau:
Remplacez le nom du tableau et capturez la chaîne:
Évaluez la chaîne ainsi créée, le nouveau tableau a été défini:
la source