Bashで連想配列を反復処理する方法


351

Bashスクリプトの連想配列に基づいて、キーと値を取得するためにそれを反復処理する必要があります。

#!/bin/bash

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

私は実際、for-inループを使用しているときにキーを取得する方法を理解していません。


14
$ declare -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
数学

回答:


582

キーは、感嘆符を使用してアクセスされている。${!array[@]}値を使用してアクセスされます${array[@]}

次のようにキーと値のペアを反復処理できます。

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

forステートメント内の変数を引用符で囲むことに注意してください(さらにの@代わりにを使用しています*)。これは、キーにスペースが含まれている場合に必要です。

他の回答の混乱は、質問にキー値の両方に「foo」と「bar」が含まれているという事実に起因ています。


3
これは今ある配列へのすべてのキー割り当てた場合:array=(${!hash[@]})
マイケル・O

12
:マイケル・O @:あなたは空白があり、プロテクトキーにパラメータ展開引用する必要があるarray=("${!hash[@]}")
追って通知があるまで一時停止します。

@DennisWilliamson、ありがとうございました。私はこれを思いつかなかった。
Michael-O

変数の代わりに関数の引数番号をどのように使用できますか?例えばfor i in "${!$1[@]}"
pkaramol 2018

2
@pkaramol:Bash 4.3以降では、namerefを使用できます。例: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 2017

1
説明していただけますか?foreach関数は少しトリッキーです。わかりません。
バリントシゲティ

-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.