Questão simples. O shell bash tem suporte para usar ponteiros ao escrever um script de shell?
Estou familiarizado com a notação de expansão, ${var[@]}
ao iterar sobre o array $var
, mas não está claro que isso esteja utilizando ponteiros para iterar sobre os índices do array. O bash fornece acesso a endereços de memória como outros idiomas?
Se o bash não suporta o uso de ponteiros, o que outros shells fazem?
Um ponteiro (para um local de memória ) não é realmente um conceito útil em nada de nível superior a C, seja algo como Python ou o shell. As referências a objetos são obviamente ú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 em outros shells), você pode obter os valores dos elementos da matriz com a
${array[index]}
notação, atribuí-losarray[index]=...
e obter o número de elementos na matriz com${#array[@]}
. A expressão dentro dos colchetes é uma expressão aritmética. Como um exemplo inventado, poderíamos adicionar um prefixo constante a todos os membros do array:(Se nos preocupássemos apenas 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, em vez disso, precisaríamos buscar as chaves/índices da matriz com
${!array[@]}
. Por exemploAlém disso, o Bash possui duas formas de apontar indiretamente para outra variável:
${!var}
sintaxe , que usa o valor da variável cujo nome está emvar
, edeclare
builtin (ou oksh
sinônimo -compatível,typeset
).declare -n ref=var
fazref
uma referência à variávelvar
.Namerefs também oferecem suporte à indexação, pois, se tivermos
arr=(a b c); declare -n ref=arr;
,${ref[1]}
expandiremos parab
. Usando${!p[1]}
, em vez disso, tomariap
como uma matriz e se referiria à variável nomeada por seu segundo elemento.No Bash, namerefs são literalmente isso, referências por nome e usar um nameref de dentro de uma função usará o valor local da variável nomeada. Isso vai imprimir
local value of var
.O BashFAQ também tem um artigo mais longo sobre indireção .
Não,
bash
não tem "ponteiros", mas tem referências:Na
bash
página de manual:Não, os shells não usam "ponteiros" (como entendido em C).
Arrays podem usar índices:
echo "${array[2]}"
mas@
no seu exemplo não é realmente um "ponteiro". É uma maneira de expressar "a lista de valores da matriz". Algo que o analisador de shell entenda. Semelhante à maneira a:expande para toda a lista de "Parâmetros de posição".
Enquanto bash arrays indexados inteiros podem ser definidos e acessados iterativamente assim;
Arrays indexados associativos ou baseados em string 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 realmente 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ça