Bir işaretçi ( belleğin bir yerine ), Python veya kabuk gibi bir şey olsun, C'den daha yüksek bir şeyde gerçekten yararlı bir kavram değildir. Nesnelere yapılan göndermeler elbette üst düzey dillerde yararlıdır, belki de karmaşık veri yapıları oluşturmak için bile gereklidir. Ancak çoğu durumda bellek adresleri açısından düşünmek çok yararlı olamayacak kadar düşük düzeydedir.
Bash'te (ve diğer kabuklarda), dizi öğelerinin değerlerini ${array[index]}gösterimle array[index]=...alabilir, bunları atayabilir ve dizideki öğelerin sayısını alabilirsiniz ${#array[@]}. Parantez içindeki ifade aritmetik bir ifadedir. Bir örnek olarak, tüm dizi üyelerine sabit bir önek ekleyebiliriz:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(İndeksleri değil, sadece değerleri önemseseydik for x in "${array[@]}" ; do...iyi olur.)
İle ilişkisel veya seyrek diziler , sayısal döngü çok mantıklı değil, ama onun yerine biz dizi tuşları / dizinleri getirmesi gerekiyordu ${!array[@]}. Örneğin
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Buna ek olarak, Bash'in dolaylı olarak başka bir değişkeni göstermenin iki yolu vardır:
- Dolaylı genişletme kullanılarak sözdizimini değişkeninin değerini kullanır, adı olan , ve
${!var}var
declareyerleşik (veya -uyumluksh eşanlamlı typeset) ile oluşturulması gereken aderefs . declare -n ref=varyapar refdeğişken bir referans var.
Namerefs da destek indeksleme, biz varsa ki arr=(a b c); declare -n ref=arr;o ${ref[1]}kadar genişleyecektir b. Kullanılması ${!p[1]}yerine alacaktı pbir dizi olarak ve ikinci elemanı tarafından adındaki değişkene bakın.
Bash, namerefs tarafından o, referanslar anlamıyla isim ve bir işlev içinden bir nameref kullanılarak isimli değişkenin yerel değerini kullanır. Bu yazdırılacaktır local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ'nun dolaylı yayın konusunda da daha uzun bir makalesi var .