बैश में सूचकांक को निर्दिष्ट किए बिना एक सरणी में एक नया तत्व जोड़ें


जवाबों:


1539

हाँ वहाँ है:

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

बैश संदर्भ मैनुअल :

उस संदर्भ में जहां एक असाइनमेंट स्टेटमेंट शेल वैरिएबल या एरे इंडेक्स (देखें Arrays) के लिए एक मान निर्दिष्ट कर रहा है, '' = = 'ऑपरेटर को वेरिएबल के पिछले मूल्य को जोड़ने या जोड़ने के लिए इस्तेमाल किया जा सकता है।


21
यह बैश 3.2.48 (OS X 10.8.2) के साथ ठीक काम करता है। ध्यान दें कि ARRAYवास्तविक चर नाम के लिए सिर्फ एक प्लेसहोल्डर है। यहां तक ​​कि अगर आपके सरणी सूचकांक अनुक्रमिक नहीं हैं, तो इसके साथ +=
संलग्न

3
क्या बाश संस्करण 4.2.24 (1) में ऐसा कुछ है?
अली इस्माइलोव

195
यह नोट करना महत्वपूर्ण है, कि ARRAY + = ('foo') ARRAY + = 'foo' की तुलना में अलग है, जो स्ट्रिंग 'foo' को निम्नतम (?) कुंजी के साथ प्रविष्टि में जोड़ता है।
कंस्ट्रक्टर

8
Wiki.bash-hackers.org/scripting/bashchanges के अनुसार , यह वाक्य रचना पहली बार 3.1-अल्फा 1 संस्करण में दिखाई दी थी।
डेविड याव

39
@ जैस: पूरे एरे को एक्सेस करने के लिए , आपको उपयोग करना होगा ${myarray[@]}- एरे वेरिएबल को संदर्भित करना जैसे कि यह एक स्केलर था, इसके एलिमेंट को एक्सेस करने के समान है; दूसरे शब्दों में: $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
उत्तम सामग्री; कभी नहीं पता था कि एटरिंग-निष्कर्षण सिंटैक्स सरणियों पर भी लागू किया जा सकता है; नियम, परीक्षण और त्रुटि द्वारा निर्धारित (bash 3.2.48): ${array[@]: start[:count]}रिटर्न काउंट एलिम्स। या, यदि निर्दिष्ट नहीं है, तो सभी शेष एल.एम. निम्नलिखित हाथी पर शुरू करना: - यदि प्रारंभ> = 0: हाथी से। जिसका सूचकांक> = प्रारंभ है। - यदि प्रारंभ करें <0: हाथी से। किसका सूचकांक (अंतिम सरणी सूचकांक + 1) - एब्स (प्रारंभ); गुफा: यदि अनुपस्थित (प्रारंभ)> (अंतिम सरणी सूचकांक + 1), एक अशक्त स्ट्रिंग लौटा दी जाती है। यदि गणना निर्दिष्ट की जाती है, तो कई तत्व वापस आ जाते हैं, भले ही उनके सूचकांक शुरू से ही सन्निहित न हों।
mklement0

3
@ गणना: बैश 4.2 में, आप सरणी के अंत से गणना करने वाले तत्वों तक पहुंचने के लिए नकारात्मक सरणी सदस्यता का उपयोग कर सकते हैं। ${array[-1]}
अगली सूचना तक रोक दिया गया।

यह जानना अच्छा है, धन्यवाद। OS X (10.8.2 के अनुसार) अभी भी 3.2.48 का उपयोग करता है, और stackoverflow.com/questions/10418616/… मुझे बताता है कि, दुर्भाग्य से, "Apple बैश के काफी पुराने संस्करण का उपयोग करते हैं, क्योंकि वे उस कोड को शिप नहीं करते हैं जो लाइसेंस प्राप्त है। GPL3 के तहत। "
15:27 पर mklement0

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

8
bash संस्करणों के लिए अच्छा है जो ई = 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
हां, आप कर सकते हैं, लेकिन +=सिंटैक्स (@ e-t172 का उत्तर देखें) (ए) सरल है, और (बी) ऐसे सरणियों के साथ भी काम करता है जो गैर-
संदर्भ हैं

ईमानदारी से यह समाधान (मेरे लिए) "+ =" से बेहतर काम कर रहा है, क्योंकि उत्तरार्द्ध के साथ लंबाई कभी-कभी गलत होती है (एक तत्व को जोड़ने पर दो से बढ़ जाती है) ... इसलिए मैं इस उत्तर को पसंद करता हूं! :)
पियरपोलो सीरा

यह बैश के पुराने संस्करणों में भी काम करता है, इससे पहले +=जोड़ा गया था, उदाहरण के लिए संस्करण 2
Zoey Hewll

1
यह तब भी काम करता है जब आपके तत्वों में जगह होती है - $arr += ($el)ऐसा लगता है कि अंतरिक्ष द्वारा स्ट्रिंग को विभाजित करना और प्रत्येक तत्वों को जोड़ना है।
मैक्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.