শেল স্ক্রিপ্টগুলিতে সহযোগী অ্যারে


11

আমি শেল স্ক্রিপ্টে সহযোগী অ্যারে বাস্তবায়নের জন্য একটি কৌশল দেখেছি trick উদাহরণস্বরূপ যেখানে কী = আপেল print array["apples"]হিসাবে স্ক্রিপ্ট করা যেতে পারে echo \$array$key

তবে অ্যারেতে পুনরাবৃত্তি করার কীগুলি কীভাবে উত্পন্ন করা যায় সে সম্পর্কে কোনও উল্লেখ নেই। আমি ভাবতে পারি যে উপায়গুলি স্পেস দ্বারা বিভাজনযুক্ত ভেরিয়েবলের মধ্যে কীগুলি সংরক্ষণ করা ছিল যাতে আমি অ্যারের উপরে পুনরাবৃত্তি করতে একটি লুপ ব্যবহার করতে পারি।

সুতরাং, পরে ব্যবহারের জন্য কীগুলি সংরক্ষণ করার কোনও অন্য উপায় আছে?


5
যদি আপনি শেল স্ক্রিপ্টে সহযোগী অ্যারেগুলি ব্যবহার করার চেষ্টা করছেন তবে এটি সম্ভব হতে পারে যে আপনার প্রকল্পটি শেল স্ক্রিপ্টের জন্য খুব জটিল :) :)
মার্টিন ভন উইট্টিচ

@ মার্টিনভনভিটিক্স কেন? আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা 3 টি সম্ভাব্য ডিবি স্কিমার মধ্যে একটিতে এসকিউএল স্ক্রিপ্ট চালায়। প্রয়োজনীয় স্কিমা একটি সংক্ষিপ্তসার সহ ফাইল নাম অন্তর্ভুক্ত করা হয়। আমার এই সংক্ষিপ্তসার এবং আসল স্কিমা নামের মধ্যে একটি ম্যাপিং দরকার। প্রকৃত স্কিমা নাম বিবেচনা (সংক্ষিপ্তকরণ নয়) বিবেচনা করে কোন সহযোগী অ্যারের চেয়ে আরও ভাল উপায় পরিবেশের মধ্যে পৃথক হতে পারে, সুতরাং একটি অ্যারে ভেরিয়েবল (যার মানগুলি একবারে সেট করা যেতে পারে) নিখুঁত
স্লাভ

2
@ স্লাভ আমি সাহসী অ্যারেগুলির বিরুদ্ধে তর্ক করছি না, কেবল শেল স্ক্রিপ্টগুলির বিরুদ্ধে যেখানে এই জাতীয় জটিলতা প্রয়োজন। তবে এটি কেবল আমার ব্যক্তিগত পছন্দ; আমি প্রায়শই নিজেকে শেল স্ক্রিপ্ট লিখতে শুরু করি এবং তখনই পার্লে তাৎক্ষণিকভাবে এটি আবার লিখতে শুরু করি যখন আমি বুঝতে পারি যে আমি একটি নির্দিষ্ট জটিলতার প্রান্তিকে ছাড়িয়ে যাচ্ছি।
মার্টিন ভন উইট্টিচ

উত্তর:


20

সহযোগী অ্যারে সহ শেলস

কিছু আধুনিক শেলগুলি সম্মিলিত অ্যারে সরবরাহ করে: ksh93, ব্যাশ ≥4, zsh। Ksh93 এবং bash এ, যদি aকোনও সহযোগী অ্যারে "${!a[@]}"হয় তবে এর কীগুলির অ্যারেটি হ'ল:

for k in "${!a[@]}"; do
  echo "$k -> ${a[$k]}"
done

Zsh এ, সেই সিনট্যাক্সটি কেবল ksh এমুলেশন মোডে কাজ করে। অন্যথায় আপনাকে zsh এর নেটিভ সিনট্যাক্স ব্যবহার করতে হবে:

for k in "${(@k)a}"; do
  echo "$k -> $a[$k]"
done

${(k)a}aখালি কী না থাকলে এছাড়াও কাজ করে।

Zsh এ আপনি একই সাথে উভয় kআইস এবং vপ্রান্তিকদের উপর লুপ করতে পারেন :

for k v ("${(@kv)a}") echo "$k -> $v"

সহযোগী অ্যারে ছাড়া শেলস

শেলগুলিতে এসোসিয়েটিভ অ্যারেগুলিকে এমুলেটিং করা অনেক বেশি কাজ। আপনার যদি সহযোগী অ্যারেগুলির প্রয়োজন হয় তবে সম্ভবত সম্ভবত এখন কোনও বড় সরঞ্জাম আনার সময় হবে, যেমন ksh93 বা পার্ল।

যদি আপনার কেবলমাত্র পসিক্স শেলটিতে সহযোগী অ্যারেগুলির প্রয়োজন হয় তবে এগুলি অনুকরণ করার একটি উপায় এখানে রয়েছে যখন কীগুলিতে কেবল অক্ষর 0-9A-Z_a-z(এএসসিআইআই ডিজিট, অক্ষর এবং আন্ডারস্কোর) অন্তর্ভুক্ত থাকে। এই অনুমানের অধীনে, কীগুলি চলক নামের অংশ হিসাবে ব্যবহার করা যেতে পারে। নীচের ফাংশনগুলি একটি নামকরণ উপসর্গ দ্বারা চিহ্নিত একটি অ্যারের উপর কাজ করে, "স্টেম", যা অবশ্যই পরপর দুটি আন্ডারস্কোর না থাকতে পারে।

## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
  eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
  eval "echo \"\$__aa__${1}\""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
  eval "unset $3
        case \$__aa__${1} in
          *\" $2 \"*) $3=\$__aa__${1}__$2;;
        esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
  eval "__aa__${1}__${2}=\$3
        case \$__aa__${1} in
          *\" $2 \"*) :;;
          *) __aa__${1}=\"\${__aa__${1}}$2 \";;
        esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
  eval "unset __aa__${1}__${2}
        case \$__aa__${1} in
          *\" $2 \"*) __aa__${1}=\"\${__aa__${1}%%* $2 } \${__aa__${1}#* $2 }\";;
        esac"
}

(সতর্কতা, অরক্ষিত কোড synt সিনট্যাক্টিকালি অবৈধ কান্ড এবং কীগুলির জন্য ত্রুটি সনাক্তকরণ সরবরাহ করা হয়নি))


5

আপনি স্টোর দ্বারা কী বোঝাতে চাইছেন তা নিশ্চিত নই তবে আপনি ${!array[@]}সিনট্যাক্সটি ব্যবহার করে কীগুলি দিয়ে পুনরাবৃত্তি করতে পারেন :

$ typeset -A foo=([key1]=bar [key2]=baz);
$ echo "${!foo[@]}" 
key2 key1

সুতরাং, পুনরাবৃত্তি করতে:

$ for key in "${!foo[@]}"; do echo "$key : ${foo[$key]}"; done
key2 : baz
key1 : bar

আমি একটা চমৎকার, এই ছোট টিউটোরিয়াল পাওয়া এখানে


নীচের মন্তব্যে নির্দেশিত হিসাবে, মিশ্র অ্যারেগুলি bash৪ র্থ সংস্করণে যুক্ত করা হয়েছে , এই বিষয়ে লিনাক্স জার্নাল নিবন্ধের জন্য এখানে দেখুন ।


1
(bash version 4 only)এটি লক্ষণীয় একটি গুরুত্বপূর্ণ বিষয়। .তিহ্যগতভাবে, bashঅ্যারেগুলি কেবল সংখ্যাযুক্ত।
রিকি বিম 23

1
আপনি আপনার উদাহরণগুলির typesetপরিবর্তে ব্যবহার করতে চাইতে পারেন declare। এটি তাদের ব্যাশ 4 এবং ksh93 এর মধ্যে বহনযোগ্য করে তুলবে যা প্রথমে শেল এসোসিয়েটিভ অ্যারে প্রয়োগ করে।
jlliagre

0

সহযোগী অ্যারে ছাড়া শেলস

কীগুলি যখন [0-9A-Za-z_](সংখ্যা, অক্ষর, আন্ডারস্কোর) সীমাবদ্ধ থাকে তখন তেমন শক্ত হয় না ।

কৌশলটি অ্যারে [ $ কী ], ভেরিয়েবল অ্যারে_ $ কীতে সঞ্চয় করার পরিবর্তে ।

সেট করুন:

eval "array_$key='$value'"

পাওয়া:

value=`eval echo '$'array_$key`

দ্রষ্টব্য: মানগুলিতে '(একক উদ্ধৃতি) থাকতে পারে না ।


-1

এই ব্যাশ কাজ করে

cert="first"
web="second"
declare -A assoc_array=(["cert"]="${cert}" ["web"]="${web}")
echo "first is" ${assoc_array[cert]}
echo "second is" ${assoc_array[web]}

অথবা

#loop
for i in "${assoc_array[@]}"
do
   echo "$i"
done

ইভাল আফাইক ব্যবহার করার দরকার নেই


1
আমি বিশ্বাস করি আপনি প্রশ্নের বিন্দুটি মিস করেছেন।
জি-ম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.