Un pointeur (vers un emplacement de mémoire ) n'est pas vraiment un concept utile dans quelque chose de plus élevé que C, que ce soit quelque chose comme Python ou le shell. Les références aux objets sont bien sûr utiles dans les langages de haut niveau, peut-être même nécessaires pour construire des structures de données complexes. Mais dans la plupart des cas, penser en termes d'adresses mémoire est un niveau trop bas pour être très utile.
Dans Bash (et autres shells), vous pouvez obtenir les valeurs des éléments du tableau avec la ${array[index]}
notation, les affecter avec array[index]=...
et obtenir le nombre d'éléments du tableau avec ${#array[@]}
. L'expression entre crochets est une expression arithmétique. Par exemple, nous pourrions ajouter un préfixe constant à tous les membres du tableau:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Si nous nous soucions uniquement des valeurs, et non des index, ce for x in "${array[@]}" ; do...
serait bien.)
Avec des tableaux associatifs ou clairsemés , une boucle numérique n'a pas beaucoup de sens, mais à la place nous aurions besoin de récupérer les clés / index du tableau avec ${!array[@]}
. Par exemple
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
En plus de cela, Bash a deux façons de pointer indirectement vers une autre variable:
- expansion indirecte , en utilisant la
${!var}
syntaxe , qui utilise la valeur de la variable dont le nom est var
, et
- namerefs , qui doivent être créés avec la commande
declare
intégrée (ou le ksh
synonyme compatible typeset
). declare -n ref=var
fait ref
référence à la variable var
.
Namerefs indexation également un soutien, en ce que si nous avons arr=(a b c); declare -n ref=arr;
alors ${ref[1]}
sera étendu à b
. À la ${!p[1]}
place, l'utilisation prendrait la p
forme d'un tableau et ferait référence à la variable nommée par son deuxième élément.
Dans Bash, les namerefs sont littéralement que, les références par nom et l'utilisation d'un nameref à l'intérieur d'une fonction utiliseront la valeur locale de la variable nommée. Cela s'imprimera local value of var
.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ a également un article plus long sur l'indirection .
for foo in "${array[@]}" ; do ... done
sauf si vous avez besoin de l'index à d'autres fins.Non,
bash
n'a pas de "pointeurs", mais il a des références:Depuis la
bash
page de manuel:la source
Non, les shells n'utilisent pas de "pointeurs" (comme compris en C).
Les tableaux peuvent utiliser des indices:
echo "${array[2]}"
mais@
dans votre exemple, ce n'est pas vraiment un "pointeur". C'est un moyen d'exprimer "la liste des valeurs du tableau". Quelque chose que l'analyseur de shell comprend. Similaire à la façon dont a:s'étend à toute la liste des "Paramètres positionnels".
la source
Alors que les tableaux indexés en entier bash peuvent être définis et accessibles de manière itérative comme ceci;
Les tableaux indexés associatifs ou basés sur des chaînes dans bash nécessitent la définition itérative suivante;
Pour répondre à la question concernant les pointeurs et en utiliser un de bash; la fonctionnalité interne du binaire bash compilé utilise en effet des pointeurs vers la mémoire allouée sur la pile et expose des fonctionnalités similaires avec l'utilisation de
eval
. Voir [références indirectes] http://tldp.org/LDP/abs/html/ivr.html )Il y a des dragons; l'utilisation de
eval
doit être utilisée avec prudence en raison des implications en matière de sécuritéla source