Bash에서 연관 배열을 반복하는 방법


351

Bash 스크립트의 연관 배열을 기반으로 키와 값을 얻으려면 반복해야합니다.

#!/bin/bash

declare -A array
array[foo]=bar
array[bar]=foo

실제로 for-in 루프를 사용하는 동안 키를 얻는 방법을 이해하지 못합니다.


14
$ notify -A array = ([foo] = bar [bar] = foo) # 한 번에 모두 초기화
anisbet

3
작은 키 값 목록의 경우 다음을 고려할 수 있습니다.for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
math

답변:


581

느낌표를 사용하여 키에 액세스합니다. ${!array[@]}, 을 사용하여 액세스 ${array[@]}합니다.

다음과 같이 키 / 값 쌍을 반복 할 수 있습니다.

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

for명령문 에서 변수 주위에 따옴표를 사용하십시오 (및 @대신을 사용하십시오 *). 키에 공백이 포함 된 경우 필요합니다.

다른 답변의 혼란은 귀하의 질문에 키 값 모두에 대해 "foo"와 "bar"가 포함된다는 사실에서 비롯 됩니다.


3
모든 키를 배열에 할당하면 다음과 같습니다.array=(${!hash[@]})
Michael-O

12
@ Michael-O : 공백이있을 수있는 키를 보호하기 위해 매개 변수 확장을 인용해야합니다.array=("${!hash[@]}")
추가 통지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson 감사합니다. 나는 내 마음에 이것을하지 않았다.
Michael-O

변수 대신 함수 인수 번호를 어떻게 사용할 수 있습니까? 예를 들어 for i in "${!$1[@]}"?
pkaramol

2
@ pkaramol : Bash 4.3부터 namerefs를 사용할 수 있습니다. 예 : declare -A aa; aa['A']=a1; aa['B']=b2; aa['C']=c3; foo () { declare -n assoc=$1; for key in "${!assoc[@]}"; do echo "Key: $key; Value: ${assoc[$key]}"; done; }; foo aa. 중요한 정보는 BashFAQ / 006 을 참조하십시오 .
추후 공지가있을 때까지 일시 중지되었습니다.

42

다음을 사용하여 키에 액세스 할 수 있습니다 ${!array[@]}.

bash-4.0$ echo "${!array[@]}"
foo bar

그런 다음 키 / 값 쌍을 반복하는 것이 쉽습니다.

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

1
나는 "!" -눈치 채지 못했지만 아무것도 없었습니다 .. :)
pex

8

이 고차 함수를 사용하여 운명피라미드 를 막으십시오

foreach(){ 
  arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; 
  for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done
}

예:

$ bar(){ echo "$1 -> $2"; }
$ declare -A foo["flap"]="three four" foo["flop"]="one two"
$ foreach foo bar
flap -> three four
flop -> one two

1
이것이 어떻게 적용되는지 잘 모르겠습니다. 운명의 피라미드는 순전히 미학적 문제가 아니며 실제로 객체 지향 언어에만 적용됩니까?
Alexej Magura

1
설명해 주시겠습니까? foreach 함수는 약간 까다 롭습니다. 나는 그것을 얻지 못한다.
Bálint Szigeti

-1
declare -a arr
echo "-------------------------------------"
echo "Here another example with arr numeric"
echo "-------------------------------------"
arr=( 10 200 3000 40000 500000 60 700 8000 90000 100000 )

echo -e "\n Elements in arr are:\n ${arr[0]} \n ${arr[1]} \n ${arr[2]} \n ${arr[3]} \n ${arr[4]} \n ${arr[5]} \n ${arr[6]} \n ${arr[7]} \n ${arr[8]} \n ${arr[9]}"

echo -e " \n Total elements in arr are : ${arr[*]} \n"

echo -e " \n Total lenght of arr is : ${#arr[@]} \n"

for (( i=0; i<10; i++ ))
do      echo "The value in position $i for arr is [ ${arr[i]} ]"
done

for (( j=0; j<10; j++ ))
do      echo "The length in element $j is ${#arr[j]}"
done

for z in "${!arr[@]}"
do      echo "The key ID is $z"
done
~
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.