Un puntatore (verso una posizione di memoria ) non è in realtà un concetto utile in qualcosa di livello superiore a C, sia esso qualcosa come Python o la shell. I riferimenti agli oggetti sono ovviamente utili in linguaggi di alto livello, forse persino necessari per costruire strutture di dati complesse. Ma nella maggior parte dei casi pensare in termini di indirizzi di memoria è un livello troppo basso per essere molto utile.
In Bash (e altre shell), è possibile ottenere i valori degli elementi dell'array con la ${array[index]}notazione, assegnarli con array[index]=...e ottenere il numero di elementi dell'array con ${#array[@]}. L'espressione tra parentesi è un'espressione aritmetica. Come esempio inventato, potremmo aggiungere un prefisso costante a tutti i membri dell'array:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Se ci preoccupassimo solo dei valori e non degli indici, for x in "${array[@]}" ; do...andrebbe bene.)
Con array associativi o sparsi , un ciclo numerico non ha molto senso, ma invece dovremmo recuperare le chiavi / gli indici dell'array ${!array[@]}. Per esempio
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Inoltre, Bash ha due modi per indirizzare indirettamente verso un'altra variabile:
- espansione indiretta , utilizzando la
${!var}sintassi , che utilizza il valore della variabile il cui nome è in var, e
- namerefs , che devono essere creati con il
declarebuiltin (o il kshsinonimo compatibile typeset). declare -n ref=varfa refun riferimento alla variabile var.
Namerefs supporta anche l'indicizzazione, nel senso che se lo avremo arr=(a b c); declare -n ref=arr;poi ${ref[1]}si espanderà a b. Utilizzare ${!p[1]}invece prenderebbe pcome un array e fare riferimento alla variabile denominata dal suo secondo elemento.
In Bash, namerefs è letteralmente quello, i riferimenti per nome e l'uso di un nameref all'interno di una funzione utilizzerà il valore locale della variabile denominata. Questo stamperà local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ ha anche un articolo più lungo sull'indirizzamento indiretto .