বাশে সাহসী অ্যারেগুলিতে কীভাবে পুনরাবৃত্তি করা যায়


351

বাশ স্ক্রিপ্টে একটি সহযোগী অ্যারের ভিত্তিতে, কী এবং মানটি পেতে আমার এটিকে পুনরাবৃত্তি করতে হবে।

#!/bin/bash

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

ইন-লুপটি ব্যবহার করার সময় কীটি কীভাবে পাবেন তা আমি আসলে বুঝতে পারি না।


14
$ ডিক্লেয়ার -এ অ্যারে = ([foo] = বার [বার] =
ফু

3
মূল মানগুলির একটি ছোট তালিকার জন্য আপনি এটি বিবেচনা করতে পারেন:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
গণিত

উত্তর:


581

কী কোন বিস্ময়বোধক বিন্দু দিয়ে অ্যাক্সেস করা হয়: ${!array[@]}, মান ব্যবহার করা হয় ${array[@]}

আপনি কী / মান যুক্তগুলি এর মতো পুনরাবৃত্তি করতে পারেন:

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

forবিবৃতিতে ভেরিয়েবলের চারপাশে উদ্ধৃতিগুলির ব্যবহারটি লক্ষ করুন (প্লাস @পরিবর্তে এর পরিবর্তে *)। কোনও কীতে ফাঁকা স্থান অন্তর্ভুক্ত হলে এটি প্রয়োজনীয়।

অন্য উত্তরের বিভ্রান্তিটি এ থেকে আসে যে আপনার প্রশ্নটিতে কী এবং মান উভয়ের জন্য "ফু" এবং "বার" অন্তর্ভুক্ত রয়েছে ।


3
অ্যারেতে সমস্ত কীগুলি বরাদ্দ করা হলে এটি এখন:array=(${!hash[@]})
মাইকেল-ও

12
@ মাইকেল-ও: সাদা অংশ থাকতে পারে এমন কীগুলি রক্ষা করতে আপনার প্যারামিটার সম্প্রসারণের উদ্ধৃতি দিতে হবে:array=("${!hash[@]}")
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত

@ ডেনিস উইলিয়ামসন, অনেক ধন্যবাদ আমার মনে এটা ছিল না।
মাইকেল-ও

ভেরিয়েবলের পরিবর্তে আমরা কীভাবে একটি ফাংশন আর্গুমেন্ট নম্বর ব্যবহার করতে পারি? যেমন for i in "${!$1[@]}"?
পিকারামল

2
@ পিকারামল: ৪.৩ বাশে শুরু করে আপনি নামেরফ ব্যবহার করতে পারবেন। উদাহরণ: 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। কিছু গুরুত্বপূর্ণ তথ্যের জন্য দয়া করে বাশফ্যাকএ / 006 দেখুন ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

42

আপনি কীগুলি এর সাথে অ্যাক্সেস করতে পারেন ${!array[@]}:

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

তারপরে, কী / মান জোড়গুলির উপরে পুনরাবৃত্তি করা সহজ:

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

1
আমার ছিল "!" - এমনকি খেয়ালও করেনি, কিছুই ছিল না, দুঃখিত .. :)
পেরেক্স

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
আমি নিশ্চিত না এটি কীভাবে প্রযোজ্য? ডুমের পিরামিড কি খাঁটি নান্দনিক সমস্যা এবং সত্যই কেবল বস্তু-ভিত্তিক ভাষায় প্রযোজ্য নয়?
আলেকজ মাগুরা

1
আপনি এটা ব্যাখ্যা করতে পারেন? ভবিষ্যতের কাজটি কিছুটা জটিল। আমি পাই না।
বুলিন্ট সিজিটি

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