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ą
declare
wbudowanego (lub ksh
kompatybilnego synonimu typeset
). declare -n ref=var
tworzy ref
odniesienie 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 p
jako 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 .
for foo in "${array[@]}" ; do ... done
chyba że potrzebujesz indeksu do innych celów.Nie,
bash
nie ma „wskaźników”, ale ma odniesienia:Ze strony podręcznika
bash
:źródło
Nie, powłoki nie używają „wskaźników” (w rozumieniu C).
Tablice mogą korzystać z indeksów:
echo "${array[2]}"
ale@
w twoim przykładzie tak naprawdę nie jest to „wskaźnik”. Jest to sposób wyrażenia „listy wartości tablic”. Coś, co parser powłoki rozumie. Podobnie do sposobu:rozwija się do wszystkich list „Parametry pozycyjne”.
źródło
Podczas gdy tablice indeksowane liczbami całkowitymi bash mogą być definiowane i dostępne iteracyjnie tak;
Tablice indeksowane asocjacyjne lub oparte na łańcuchach w bash wymagają następującej iteracyjnej definicji;
Aby odpowiedzieć na pytanie dotyczące wskaźników i korzystania z jednego z bash; wewnętrzna funkcjonalność skompilowanego pliku bash naprawdę korzysta ze wskaźników do pamięci przydzielonej na stosie i udostępnia podobną funkcjonalność przy użyciu
eval
. Zobacz [odniesienia pośrednie] http://tldp.org/LDP/abs/html/ivr.html )Są smoki; Stosowanie
eval
należy stosować ostrożnie ze względu na wpływ na bezpieczeństwoźródło