2011-07-17 12 views
98

Chcę zrobić coś takiego:zapętlenie nad tablicami, drukowanie zarówno indeks i wartość

foo=() 
foo[0]="bar" 
foo[35]="baz" 
for((i=0;i<${#foo[@]};i++)) 
do 
    echo "$i: ${foo[$i]}" 
done 
# Output: 
# 0: bar 
# 1: 

Potem próbowałem pętli nim używając w:

foo=() 
foo[0]="bar" 
foo[35]="baz" 
for i in ${foo[@]} 
do 
    echo "?: $i" 
done 
# Output: 
# ?: bar 
# ?: naz 

ale tutaj I don” t znać wartość indeksu.

wiem, że mogłem coś

foo=() 
foo[0]="bar" 
foo[35]="baz" 
declare -p foo 
# Output: 
# declare -a foo='([0]="bar" [35]="baz")' 

ale nie można to zrobić w inny sposób?

Odpowiedz

168

Można by znaleźć klucze tablicę z "${!foo[@]}" (reference), więc:

for i in "${!foo[@]}"; do 
    printf "%s\t%s\n" "$i" "${foo[$i]}" 
done 
+4

Ważna uwaga, podczas iterable, przestrzeń oddzielona lista słów to _nie_ tablica. Owiń to tak, aby '(a b c)' przekształcić go w tablicę. – Breedly

+1

Użycie "[@]" i podwójnych cudzysłowów oznacza, że ​​nie jest to "rozdzielona spacjami lista słów". Otrzymasz listę rzeczywistych kluczy tablicy, nawet jeśli poszczególne klucze zawierają spacje. –

+0

@glennjackman Czy możesz wyjaśnić to bardziej "Używanie [@] i podwójnych cudzysłowów oznacza, że ​​nie jest to" lista słów oddzielonych spacjami "' –

4

zawsze można użyć iteracji param:

 ITER=0 
     for I in ${FOO[@]} 
     do 
      echo ${I} ${ITER} 
      ITER=$(expr $ITER + 1) 
     done 
+0

'((ITER ++))' we współczesnej bash –

+0

Dlaczego post-inkrementacja? Chcesz tylko, aby wartość była zwiększana, stąd ((++ ITER)) jest bardziej bezpośrednio stwierdzeniem tego, co chcesz zrobić ... – MikeW

1
INDEX=0 
for i in $list; do 
    echo ${INDEX}_$i 
    let INDEX=${INDEX}+1 
done 
+0

Twoja odpowiedź z pewnością warta jest trochę wyjaśnienia. Prosimy zapoznać się z http://stackoverflow.com/help/how-to-answer. Komentarze pomogłyby w tworzeniu treści do wyszukiwania. –

+3

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – kayess

Powiązane problemy