Có cách nào để liệt kê tất cả 'ID chỉ mục' (khóa) trên biến mảng kết hợp bash không?


26

Tôi có mảng này:

declare -A astr

Tôi thêm các yếu tố cho nó:

astr[elemA]=123
astr[elemB]=199

Nhưng sau này tôi cần biết ID chỉ mục (elemA và elemB) là gì và liệt kê chúng.

echo "${astr[@]}" #this only get me the values...

Câu trả lời:


35

Bạn có thể lấy danh sách "khóa" cho mảng kết hợp như vậy:

$ echo "${!astr[@]}"
elemB elemA

Bạn có thể lặp lại các "phím" như vậy:

for i in "${!astr[@]}"
do   
  echo "key  : $i"
  echo "value: ${astr[$i]}"
done

Thí dụ

$ for i in "${!astr[@]}"; do echo "key  : $i"; echo "value: ${astr[$i]}"; done
key  : elemB
value: 199
key  : elemA
value: 123

Tài liệu tham khảo


1
Tôi chỉ tìm thấy nó cũng hoạt động cho các mảng được lập chỉ mục số: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Sức mạnh Bảo Bình

@AquariusPower - Vâng, nếu bạn chỉnh sửa lại câu trả lời của tôi, bạn sẽ thấy rằng ban đầu tôi cũng đã bao gồm chỉ số số, nhưng sau đó đã bỏ nó vì bạn muốn băm có tên.
slm

Lưu ý rằng ${!var[index]}không hoạt động, chỉ ${!var[@]}hoặc ${!var[*]}làm :(
i336_

@ i336_ - hãy !ra ngoài đi ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm

Xin lỗi, làm rõ: Tôi đã cố gắng xác định khóa kết hợp cho chỉ số số n . Tôi nhận ra rằng tôi có thể dễ dàng làm keys=(${!var[@]})và sau đó ${keys[n]}, đưa cho tôi chỉ số, nhưng khoảng thời gian đó tôi cũng nhận ra rằng tôi cần phải suy nghĩ lại về cách tiếp cận của mình.
i336_
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.