বাশের সূচকে নির্দিষ্ট না করে অ্যারেতে একটি নতুন উপাদান যুক্ত করুন


উত্তর:


1539

হ্যা এখানে:

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

বাশ রেফারেন্স ম্যানুয়াল :

যে ক্ষেত্রে একটি অ্যাসাইনমেন্ট স্টেটমেন্ট শেল ভেরিয়েবল বা অ্যারে সূচক (অ্যারেগুলি দেখুন) এর জন্য একটি মান নির্ধারণ করে সেখানে, '+ =' অপারেটরটি ভেরিয়েবলের আগের মানটিতে সংযোজন বা যুক্ত করতে ব্যবহৃত হতে পারে।


21
এটি ব্যাশ 3.2.48 (ওএস এক্স 10.8.2) এর সাথে ঠিক কাজ করে। দ্রষ্টব্য যে ARRAYআসল পরিবর্তনশীল নামের জন্য কেবলমাত্র একটি স্থানধারক। এমনকি যদি আপনার অ্যারে সূচকগুলি ক্রমানুসারে না+= হয় তবে
এটিকে যুক্ত করা

3
বাশ সংস্করণ ৪.২.২৪ (১) এ কি এমন কিছু আছে?
আলী ইসমাইলোভ

195
এটি লক্ষণীয় গুরুত্বপূর্ণ যে ARRAY + = ('foo') ARRAY + = 'foo' এর থেকে আলাদা, যা সর্বনিম্ন (?) কী দিয়ে প্রবেশের জন্য 'foo' স্ট্রিং যুক্ত করে।
দ্য কনস্ট্রাক্টর

8
Wiki.bash-hackers.org/scriptting/bashchanges এর মতে , এই সিনট্যাক্সটি প্রথম 3.1-alpha1 সংস্করণে উপস্থিত হয়েছিল।
ডেভিড ইয়াউ

39
@ জাস: পুরো অ্যারে অ্যাক্সেস করার জন্য আপনাকে অবশ্যই ব্যবহার করতে হবে ${myarray[@]}- অ্যারে ভেরিয়েবলটি উল্লেখ করা যেমন এটি স্কেলারের মতো হয় তবে তার উপাদান 0 অ্যাক্সেস করার সমান; অন্য কথায়: $myarrayহিসাবে একই ${myarray[0]}
mklement0

76

বোবা গাই যেমন উল্লেখ করেছেন, অ্যারেটি শূন্য থেকে শুরু হয় এবং ক্রমিক হয় কিনা তা লক্ষ করা গুরুত্বপূর্ণ। যেহেতু আপনি অ্যাসিটিং করতে পারেন এবং অ-সূচক সূচকগুলি আনসেট করতে পারেন ${#array[@]}অ্যারের শেষে সর্বদা পরবর্তী আইটেম হয় না।

$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array     # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h

শেষ সূচকটি কীভাবে পাবেন তা এখানে:

$ end=(${!array[@]})   # put all the indices in an array
$ end=${end[@]: -1}    # get the last one
$ echo $end
42

এটি ব্যাখ্যা করে যে কীভাবে অ্যারের শেষ উপাদানটি পাওয়া যায়। আপনি প্রায়শই এটি দেখতে পাবেন:

$ echo ${array[${#array[@]} - 1]}
g

আপনি দেখতে পাচ্ছেন, যেহেতু আমরা একটি বিচ্ছিন্ন অ্যারে নিয়ে কাজ করছি, এটি শেষ উপাদান নয়। এটি দুষ্প্রাপ্য এবং সংমিশ্রিত উভয় অ্যারেতে কাজ করে, যদিও:

$ echo ${array[@]: -1}
i

3
দুর্দান্ত জিনিস; কখনও জানতেন না যে স্ট্রিং-এক্সট্রাকশন সিনট্যাক্স অ্যারেতেও প্রয়োগ করা যেতে পারে; বিধিগুলি, যা পরীক্ষা এবং ত্রুটি দ্বারা নির্ধারিত হয় সেগুলি হ'ল (ব্যাশ 3.2.48): ${array[@]: start[:count]}ফেরত গণনা এলেমস। বা, যদি নির্দিষ্ট না করা হয়, বাকি সমস্ত এলিম। নিম্নলিখিত এলেমে শুরু: .: যদি শুরু হয় = 0: এলিমে থেকে। যার সূচক> = শুরু। - যদি শুরু হয় <0: এলিমে থেকে। যার সূচক (সর্বশেষ অ্যারে সূচক + 1) - অ্যাবস (শুরু); ক্যাভেট: যদি এ্যাবস (শুরু)> (সর্বশেষ অ্যারে সূচক + 1), একটি নাল স্ট্রিং ফিরে আসে। যদি গণনা নির্দিষ্ট করা থাকে তবে যতগুলি উপাদানগুলি সূচকগুলি শুরু থেকে সামঞ্জস্য না করা হয় ততই ফিরে আসে।
mklement0

3
@ এমকিলেমেন্ট: বাশ ৪.২-এ, আপনি অ্যারের শেষ থেকে গণনা করার উপাদানগুলিতে অ্যাক্সেস করতে নেতিবাচক অ্যারে সাবস্ক্রিপ্টগুলি ব্যবহার করতে পারেন। ${array[-1]}
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

ধন্যবাদ এটি জানা ভাল। OS X এর (10.8.2 হিসাবে) এখনো 3.2.48 ব্যবহার করে এবং stackoverflow.com/questions/10418616/... আমাকে বলে, দুর্ভাগ্যবশত, "অ্যাপল, ব্যাশ বেশ একটি পুরোনো সংস্করণ ব্যবহার হিসাবে তারা যে কোডটি লাইসেন্সকৃত জাহাজ না জিপিএল 3 এর অধীনে। "
mklement0

49
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest

8
ই-t172 দ্বারা ব্যাখ্যা করা + + অপারেটরের শব্দার্থক শব্দগুলি সমর্থন করে না এমন বাশ সংস্করণগুলির জন্য চমৎকার
akostadinov

12
একটি ভাল পশ্চাৎ-সামঞ্জস্যপূর্ণ সমাধান, তবে সাবধান থাকুন যে বিদ্যমান উপাদানগুলির মধ্যে যদি কোনওগুলির ফাঁকা থাকে তবে সেগুলি একাধিক উপাদানগুলিতে বিভক্ত হবে; arr=("${arr[@]}" "new")আপনার যদি তাদের ফাঁকা জায়গার সাথে উপাদান থাকে তবে ব্যবহার করুন
kbolino

1
এটি অ্যারের সামনে ধাক্কা দেওয়ার জন্যও ব্যবহার করা যেতে পারে যা আমার কেবল প্রয়োজন।
টোমা জাটো - মনিকা

29

যদি আপনার অ্যারে সর্বদা ক্রমযুক্ত হয় এবং 0 থেকে শুরু হয় তবে আপনি এটি করতে পারেন:

array[${#array[@]}]='foo'

# gets the length of the array
${#array_name[@]}

যদি আপনি অজান্তে সমান চিহ্নের মধ্যে ফাঁকা স্থান ব্যবহার করেন:

array[${#array[@]}] = 'foo'

তারপরে আপনি এর মতো একটি ত্রুটি পাবেন:

array_name[3]: command not found

5
হ্যাঁ, আপনি পারেন, তবে +=বাক্য গঠনটি (@ ই-টি 172 এর উত্তর দেখুন) হ'ল (ক) সহজ, এবং (খ)
অবরুদ্ধ

সত্যিই এই সমাধানটি (আমার জন্য) আরও ভালভাবে কাজ করছে "+ =", কারণ পরবর্তীকালের সাথে দৈর্ঘ্যটি কখনও কখনও ভুল হয় (একটি উপাদান যুক্ত করার সময় দু'টি বৃদ্ধি পায়) তাই আমি এই উত্তরটিকে পছন্দ করি! :)
পিয়ারপাওলো সিরা

এটি +=
বাশের

1
এটি তখনও কার্যকর হয় যখন আপনার উপাদানগুলির মধ্যে ফাঁকা স্থান থাকে - $arr += ($el)মনে হয় স্ট্রিংটিকে স্পেস দিয়ে বিভক্ত করে প্রতিটি উপাদান যুক্ত করে।
সর্বোচ্চ

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