Un puntero (a una ubicación de memoria ) no es realmente un concepto útil en algo de nivel superior a C, ya sea algo como Python o el shell. Las referencias a objetos son, por supuesto, útiles en lenguajes de alto nivel, tal vez incluso necesarios para construir estructuras de datos complejas. Pero en la mayoría de los casos, pensar en términos de direcciones de memoria es un nivel demasiado bajo para ser muy útil.
En Bash (y otros shells), puede obtener los valores de los elementos de la matriz con la ${array[index]}notación, asignarlos array[index]=...y obtener el número de elementos en la matriz con ${#array[@]}. La expresión dentro de los corchetes es una expresión aritmética. Como ejemplo inventado, podríamos agregar un prefijo constante a todos los miembros de la matriz:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Si solo nos preocuparan los valores, y no los índices, for x in "${array[@]}" ; do...estaría bien).
Con matrices asociativas o dispersas , un bucle numérico no tiene mucho sentido, pero en su lugar tendríamos que buscar las claves / índices de la matriz ${!array[@]}. P.ej
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Además de eso, Bash tiene dos formas de señalar indirectamente a otra variable:
- expansión indirecta , usando la
${!var}sintaxis , que usa el valor de la variable cuyo nombre está en var, y
- namerefs , que deben crearse con la función
declareincorporada (o el kshsinónimo compatible typeset). declare -n ref=varhace refuna referencia a la variable var.
Namerefs también admite la indexación, ya que si lo hemos hecho arr=(a b c); declare -n ref=arr;, ${ref[1]}se expandirá a b. En su lugar, usar ${!p[1]}tomaría pcomo una matriz y se referiría a la variable nombrada por su segundo elemento.
En Bash, namerefs es literalmente eso, las referencias por nombre y el uso de un nameref desde dentro de una función usarán el valor local de la variable nombrada. Esto se imprimirá local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ también tiene un artículo más largo sobre indirección .