2011-07-17 24 views
98

tôi muốn làm một cái gì đó như thế này:Looping trên mảng, in cả hai chỉ số và giá trị so

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

Sau đó, tôi đã cố gắng để lặp qua nó sử dụng tại:

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

nhưng ở đây tôi don' t biết giá trị chỉ mục.

Tôi biết bạn có thể cái gì đó như

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

nhưng, bạn không thể làm điều đó theo cách khác?

Trả lời

168

Bạn sẽ tìm thấy các phím mảng với "${!foo[@]}" (reference), do đó:

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

Lưu ý quan trọng, trong khi iterable, một không gian tách biệt danh sách các từ là _not_ một mảng. Bọc nó như vậy '(a b c)' để chuyển đổi nó thành một mảng. – Breedly

+1

Việc sử dụng dấu ngoặc kép '[@]' và dấu ngoặc kép có nghĩa là nó không phải là "danh sách các từ được phân cách bằng dấu cách". Bạn nhận danh sách các khóa mảng thực, ngay cả khi các khóa riêng lẻ chứa khoảng trắng. –

+0

@glennjackman bạn có thể giải thích điều này hơn 'Việc sử dụng [@] và dấu ngoặc kép có nghĩa là nó không phải là" danh sách các từ được phân tách bằng dấu cách "' –

4

bạn luôn có thể sử dụng lặp param:

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

'((ITER ++))' trong bash hiện đại –

+0

Tại sao sau tăng? Bạn chỉ muốn giá trị tăng lên, do đó ((++ ITER)) trực tiếp hơn là một tuyên bố về những gì bạn muốn làm .... – MikeW

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

Câu trả lời của bạn chắc chắn đáng để giải thích một chút. Vui lòng tham khảo http://stackoverflow.com/help/how-to-answer. Nhận xét sẽ giúp tạo nội dung có thể tìm kiếm được. –

+3

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, vui lòng không cố gắng gắn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích! – kayess

Các vấn đề liên quan