Как перебирать ассоциативные массивы в Bash
основываясь на ассоциативном массиве в скрипте Bash, мне нужно перебрать его, чтобы получить ключ и значение.
#!/bin/bash
declare -A array
array[foo]=bar
array[bar]=foo
Я на самом деле не понимаю, как получить ключ при использовании цикла for-in.
4 ответа:
доступ к ключам осуществляется с помощью восклицательного знака:
${!array[@]}
на значения доступ осуществляется с помощью${array[@]}
.вы можете перебирать пары ключ/значение следующим образом:
for i in "${!array[@]}" do echo "key : $i" echo "value: ${array[$i]}" done
обратите внимание на использование кавычек вокруг переменной в
for
заявление (плюс использование@
вместо*
). Это необходимо в случае, если любые ключи включают пробелы.путаница в другом ответе происходит от того, что ваш вопрос включает в себя "foo" и "bar" для обоих ключей и значения.
вы можете получить доступ к ключам с
${!array[@]}
:bash-4.0$ echo "${!array[@]}" foo bar
затем, повторяя пары ключ / значение легко:
for i in "${!array[@]}" do echo "key :" $i echo "value:" ${array[$i]} done
используйте эту функцию более высокого порядка, чтобы предотвратить пирамида судьбы
foreach(){ arr="$(declare -p )" ; eval "declare -A f="${arr#*=}; for i in ${!f[@]}; do "$i" "${f[$i]}"; done }
пример:
$ bar(){ echo " -> "; } $ declare -A foo["flap"]="three four" foo["flop"]="one two" $ foreach foo bar flap -> three four flop -> one two
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 ~