Um ponteiro (para um local da memória ) não é realmente um conceito útil em algo de nível superior ao C, seja algo como Python ou o shell. Naturalmente, as referências a objetos são úteis em linguagens de alto nível, talvez até necessárias para a construção de estruturas de dados complexas. Mas, na maioria dos casos, pensar em termos de endereços de memória é um nível muito baixo para ser muito útil.
No Bash (e outros shells), você pode obter os valores dos elementos da matriz com a ${array[index]}notação, atribuí-los array[index]=...e obter o número de elementos na matriz ${#array[@]}. A expressão dentro dos colchetes é uma expressão aritmética. Como exemplo inventado, podemos adicionar um prefixo constante a todos os membros da matriz:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Se apenas nos importássemos com os valores, e não com os índices, tudo for x in "${array[@]}" ; do...bem.)
Com matrizes associativas ou esparsas , um loop numérico não faz muito sentido, mas precisamos buscar as chaves / índices da matriz ${!array[@]}. Por exemplo
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Além disso, o Bash tem duas maneiras de apontar indiretamente para outra variável:
- expansão indireta , usando a
${!var}sintaxe , que usa o valor da variável cujo nome está vare
- namerefs , que precisa ser criado com o
declarebuiltin (ou o kshsinônimo compatível typeset). declare -n ref=varfaz refuma referência à variável var.
Os Namerefs também suportam indexação, pois, se tivermos arr=(a b c); declare -n ref=arr;, ${ref[1]}expandiremos para b. Em ${!p[1]}vez disso, usar pcomo matriz e se referir à variável nomeada por seu segundo elemento.
No Bash, namerefs é literalmente que, referências por nome e o uso de nameref de dentro de uma função usarão o valor local da variável nomeada. Isso será impresso local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
O BashFAQ também tem um artigo mais longo sobre indireção .