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á var
e
- namerefs , que precisa ser criado com o
declare
builtin (ou o ksh
sinônimo compatível typeset
). declare -n ref=var
faz ref
uma 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 p
como 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 .
for foo in "${array[@]}" ; do ... done
menos que você precise do índice para outros fins.Não,
bash
não possui "ponteiros", mas possui referências:Na
bash
página do manual:fonte
Não, as conchas não usam "ponteiros" (como entendido em C).
As matrizes podem usar índices:
echo "${array[2]}"
mas o@
exemplo não é realmente um "ponteiro". É uma maneira de expressar "a lista de valores de matriz". Algo que o analisador de shell entende. Semelhante à maneira a:expande para toda a lista "Parâmetros posicionais".
fonte
Embora as matrizes indexadas ao número inteiro do bash possam ser definidas e acessadas iterativamente da mesma forma;
Matrizes indexadas associativas ou baseadas em strings no bash requerem a seguinte definição iterativa;
Para responder à pergunta sobre ponteiros e usar um do bash; a funcionalidade interna do binário bash compilado de fato faz uso de ponteiros para a memória alocada na pilha e expõe funcionalidade semelhante com o uso de
eval
. Veja [referências indiretas] http://tldp.org/LDP/abs/html/ivr.html )Existem dragões; o uso de
eval
deve ser usado com cautela devido a implicações de segurançafonte