سؤال

استنادًا إلى صفيف ترابط في نص باش ، أحتاج إلى التكرار عليه للحصول على المفتاح والقيمة.

#!/bin/bash

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

أنا في الواقع لا أفهم كيفية الحصول على المفتاح أثناء استخدام حلقة من أجل.

هل كانت مفيدة؟

المحلول

يتم الوصول إلى المفاتيح باستخدام علامة تعجب: ${!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 $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
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
~
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top