Um ponteiro (para uma localização de memória ) não é realmente um conceito útil em algo de nível superior a C, seja algo como Python ou o shell. Referências a objetos são naturalmente ú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 é muito baixo para ser muito útil.
No Bash (e outros shells), você pode obter os valores dos elementos do array com a notação ${array[index]}
, atribuí-los com array[index]=...
e obter o número de elementos no array com ${#array[@]}
. A expressão dentro dos colchetes é uma expressão aritmética. Como exemplo inventado, poderíamos adicionar um prefixo constante a todos os membros da matriz:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Se nos importássemos apenas com os valores, e não com os índices, apenas for x in "${array[@]}" ; do...
estaria bem.)
Com associativo ou matrizes esparsas , um loop numérico não faz muito sentido, mas em vez disso, precisamos buscar as chaves / índices da matriz com ${!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 sintaxe
${!var}
, que usa o valor da variável cujo nome está emvar
e -
namerefs , que precisam ser criados com o
declare
builtin (ou o sinônimoksh
-compatível,typeset
).declare -n ref=var
tornaref
uma referência à variávelvar
.
Namerefs também suporta indexação, em que se tivermos arr=(a b c); declare -n ref=arr;
, então ${ref[1]}
será expandido para b
. Usar ${!p[1]}
, em vez disso, usaria p
como uma matriz e referir-se à variável nomeada por seu segundo elemento.
No Bash, namerefs são literalmente que, referências por nome , e usando um nameref de dentro de uma função, usarão o valor local da variável nomeada. Isto irá imprimir 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 extenso sobre a indireção .