${!ARRAYNAME[@]}
oznacza "Wskaźniki ARRAYNAME
". Jak podano w bash man page od ARRAYNAME
jest ustawiony, ale jako ciąg, a nie tablica, zwraca 0
.
Oto rozwiązanie z użyciem eval
.
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
eval array=\(\${${ARRAYNAME}[@]} \)
for fruit in "${array[@]}"; do
echo ${fruit}
done
czego pierwotnie próbuje zrobić, to stworzyć Indirect Reference. Zostały one wprowadzone w bash w wersji 2 i miały w znacznym stopniu zastąpić potrzebę eval
, gdy próbują osiągnąć zachowanie podobne do odbicia w powłoce.
Co trzeba zrobić przy użyciu odwołań pośrednich z tablicami jest zawierać [@]
w swoim odgadnąć nazwy zmiennej:
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
array="${ARRAYNAME}[@]"
for fruit in "${!array}"; do
echo $fruit
done
Wszystko, co powiedział, to jest jedna rzecz, aby korzystać pośrednie odniesienia w tym trywialny przykład, ale, jak wskazano w odnośniku dostarczonym przez Dennisa Williamsona, powinieneś wahać się, czy użyć ich w skryptach z prawdziwego świata. Są z pewnością gwarantem, że twój kod będzie bardziej zagmatwany, niż to konieczne. Zwykle można uzyskać potrzebną funkcjonalność dzięki asocjacyjnej macierzy.
proszę zobaczyć [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). –