বাশ শেল স্ক্রিপ্ট লুপ থেকে অ্যারে সূচক ভেরিয়েবল অ্যাক্সেস করছেন?


19

আমার ব্যাশ শেল স্ক্রিপ্টে অ্যারের মাধ্যমে লুপ করার সময় আমি অ্যারে সূচক ভেরিয়েবলটি অ্যাক্সেস করতে চাই।

myscript.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in ${AR[*]}; do
  echo $i
done

উপরের লিপিটির ফলাফল:

foo
bar
baz
bat

ফলাফল আমি চাই:

0
1
2
3

এটি অর্জনের জন্য আমি কীভাবে আমার স্ক্রিপ্ট পরিবর্তন করব?


7
এছাড়াও নোট করুন যে আপনি মূলত এর "${array[*]}"পরিবর্তে কখনই চান না "${array[@]}"। কম বেশি *পরিবর্তে ব্যবহার করা @এটিকে অ্যারের পরিবর্তে স্ট্রিং হিসাবে বিবেচনা করে।
জর্দানম

উত্তর:


27

অ্যারে কীগুলির তালিকা ব্যবহার করে আপনি এটি করতে পারেন । থেকে bashমানুষ পৃষ্ঠা:

${!name[@]}
${!name[*]}

অ্যারে কীগুলির তালিকা । যদি নামটি একটি অ্যারে ভেরিয়েবল হয়, তবে নাম নির্ধারিত অ্যারে সূচকগুলির (কীগুলি) তালিকায় প্রসারিত হয়। যদি নামটি অ্যারে না হয় 0তবে প্রসারিত হয় যদি নাম সেট করা থাকে এবং অন্যথায় নাল হয়। কখন @ব্যবহার করা হয় এবং ডাবল উদ্ধৃতিতে প্রসারণটি প্রদর্শিত হয়, প্রতিটি কী আলাদা শব্দে প্রসারিত হয়।

আপনার উদাহরণের জন্য:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

এর ফলে:

${AR[0]}=foo
${AR[1]}=bar
${AR[2]}=baz
${AR[3]}=bat

নোট করুন যে এটি অ-ক্রমাগত সূচকগুলির জন্যও কাজ করে:

#!/bin/bash
AR=([3]='foo' [5]='bar' [25]='baz' [7]='bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

এর ফলে:

${AR[3]}=foo
${AR[5]}=bar
${AR[7]}=bat
${AR[25]}=baz

1
যদিও এই উত্তরটি পছন্দসই ফলাফলটি সম্পাদন করে, এটি প্রিন্টফের বিবৃতি দ্বারা অযৌক্তিকভাবে অচল হয়ে পড়ে। উদাহরণস্বরূপ: printf "$i=(${AR[i]})\n"বা echo "$i=(${ARi]})"কী কী & বার পাওয়া যায় তা দেখিয়ে উভয়ই কিছুটা অতিরিক্ত দেয় তবে কড়া কথা বলতে গেলে echo "$i"ওপিটির উত্তর দেওয়া হত। বাকিটি হ'ল "বাশ ফু" :)
4'19

5

Jordanm এর উত্তর অতিরিক্ত এছাড়াও আপনি একটি কি করতে পারেন Cলুপ মত bash:

for ((idx=0; idx<${#array[@]}; ++idx)); do
    echo "$idx" "${array[idx]}"
done

1

আপনি এই জাতীয় কিছু করতে পারেন:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
length=${#AR[@]}
for (( i = 0; i < length; i++ )); do
  echo "$i"
done

আউটপুট:

0
1
2
3


আমার ভুল হতে পারে তবে পিএফএনওয়েলস উত্তর দেয় কি প্রতিটি পুনরাবৃত্তির অ্যারের দৈর্ঘ্য পুনরায় মূল্যায়ন করে না?
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.