Wskaźnik (do lokalizacji pamięci ) nie jest tak naprawdę użyteczną koncepcją na żadnym poziomie wyższym niż C, czy jest to coś takiego jak Python lub powłoka. Odniesienia do obiektów są oczywiście przydatne w językach wysokiego poziomu, być może nawet konieczne do budowania złożonych struktur danych. Ale w większości przypadków myślenie w kategoriach adresów pamięci jest zbyt niskie, aby było bardzo przydatne.
W Bash (i innych powłokach) możesz uzyskać wartości elementów tablicy za pomocą ${array[index]}notacji, przypisać je za pomocą array[index]=...i uzyskać liczbę elementów w tablicy za pomocą ${#array[@]}. Wyrażenie w nawiasach jest wyrażeniem arytmetycznym. Jako gotowy przykład możemy dodać stały prefiks do wszystkich elementów tablicy:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Gdybyśmy dbali tylko o wartości, a nie o indeksy, for x in "${array[@]}" ; do...byłoby dobrze.)
Z asocjacyjnych lub rozrzedzony tablice , pętla numeryczna nie ma większego sensu, ale zamiast tego, że musimy sprowadzić tablicy kluczy / z indeksów ${!array[@]}. Na przykład
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Oprócz tego Bash ma dwa sposoby na pośrednie wskazanie innej zmiennej:
- Ekspansja pośrednie , korzystając z
${!var}składni , który używa wartości zmiennej, której nazwa jest var, i
- namerefs , które należy utworzyć za pomocą
declarewbudowanego (lub kshkompatybilnego synonimu typeset). declare -n ref=vartworzy refodniesienie do zmiennej var.
Namerefs również wsparcie indeksowania, że jeśli mamy arr=(a b c); declare -n ref=arr;wtedy ${ref[1]}rozwinie się b. Użycie ${!p[1]}wziąłoby zamiast tego pjako tablicę i odnosi się do zmiennej nazwanej przez jej drugi element.
W Bash nameref to dosłownie to, że odwołania według nazwy i użycie nameref z wnętrza funkcji użyje lokalnej wartości nazwanej zmiennej. To zostanie wydrukowane local value of var.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ ma również dłuższy artykuł na temat pośrednictwa .