2009-12-23 9 views
488

में सूचकांक निर्दिष्ट किए बिना एक सरणी के लिए एक नया तत्व जोड़ें वहाँ बैश में PHPs $array[] = 'foo'; की तरह कुछ कर रही बनाम करने के लिए एक रास्ता है:बैश

array[0] = 'foo' 
array[1] = 'bar' 

उत्तर

965

हाँ है:

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

Bash Reference Manual :

संदर्भ में जहां एक असाइनमेंट स्टेटमेंट एक शैल चर या सरणी अनुक्रमणिका के लिए मान निर्दिष्ट कर रहा है (देखें Ar किरणें), '+ =' ऑपरेटर का उपयोग चर के पिछले मान में जोड़ने या जोड़ने के लिए किया जा सकता है।

+11

यह बैश 3.2.48 (ओएस एक्स 10.8 के साथ ठीक काम करता है। 2)। ध्यान दें कि 'ARRAY' वास्तविक चर नाम के लिए केवल प्लेसहोल्डर है। यहां तक ​​कि यदि आपके सरणी इंडेक्स _not_ अनुक्रमिक हैं, तो '+ =' के साथ संलग्न करने से बस उच्चतम अनुक्रमणिका + 1. – mklement0

+3

को असाइन किया जाएगा क्या बैश संस्करण 4.2.24 (1) में ऐसा कुछ है? –

+135

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

13

यदि आपका सरणी हमेशा अनुक्रमिक है और 0 पर शुरू होता है, तो आप ऐसा कर सकते हैं:

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

${#array_name[@]} सरणी

+3

हां, आप कर सकते हैं, लेकिन '+ =' वाक्यविन्यास (देखें @ ई-टी 172 का उत्तर) (ए) सरल है, और (बी) उन सरणी के साथ भी काम करता है जो गैर-संगत हैं और/या 0 से शुरू नहीं होते हैं। – mklement0

+0

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

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

बैश संस्करणों के लिए अच्छा है जो ई-टी 172 – akostadinov

+7

द्वारा एक अच्छा पिछड़ा-संगत समाधान द्वारा समझाया गया + = ऑपरेटर के अर्थशास्त्र का समर्थन नहीं करता है, लेकिन सावधान रहें कि यदि मौजूदा तत्वों में से कोई भी उनमें रिक्त स्थान है, तो उन्हें एकाधिक में विभाजित किया जाएगा तत्वों; 'arr = ("$ {arr [@]}" "नया") का उपयोग करें, यदि आपके पास – kbolino

+0

में रिक्त स्थान वाले तत्व हैं, तो इसका उपयोग सरणी के सामने धक्का देने के लिए भी किया जा सकता है, जो कि मुझे चाहिए। –

51

की लंबाई हो जाता है बेवकूफ लड़का बताते हैं, यह ध्यान रखना महत्वपूर्ण है कि सरणी शून्य से शुरू होती है और अनुक्रमिक है। चूंकि आप गैर-संगत सूचकांक को असाइनमेंट और अनसेट कर सकते हैं ${#array[@]} हमेशा सरणी के अंत में अगला आइटम नहीं है।

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

दिखाता है कि कैसे एक सरणी के अंतिम तत्व प्राप्त करने के लिए:

$ 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 

यहाँ कैसे पिछले सूचकांक प्राप्त करने के लिए है। आप अक्सर यह देखेंगे:

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

आप देख सकते हैं, क्योंकि हम एक विरल सरणी के साथ काम कर रहे हैं, यह पिछले तत्व नहीं है। यह दोनों विरल और सन्निहित सरणियों पर काम करता है, हालांकि: एक अनुक्रमित सरणी के साथ

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

ग्रेट सामान; कभी नहीं पता था कि सरणी-निष्कर्षण वाक्यविन्यास भी सरणी पर लागू किया जा सकता है; परीक्षण, त्रुटि और त्रुटि द्वारा निर्धारित नियम हैं (बैश 3.2.48): '$ {सरणी [@]: शुरू करें [: ​​गिनती]}' गिनती गिनती देता है। या, यदि निर्दिष्ट नहीं है, तो सभी _remaining_ elems। निम्नलिखित elem से शुरू: - अगर शुरू> = 0: elem से। जिसका सूचकांक> = शुरू होता है। - अगर शुरू होता है <0: elem से। जिसका सूचकांक है (अंतिम सरणी सूचकांक + 1) - abs (प्रारंभ); CAVEAT: यदि abs (प्रारंभ)> (अंतिम सरणी अनुक्रमणिका + 1), एक शून्य स्ट्रिंग वापस कर दी जाती है। यदि गिनती निर्दिष्ट है, तो कई तत्व लौटाए जाते हैं, भले ही उनके सूचकांक प्रारंभ से जुड़े न हों। – mklement0

+2

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

+0

यह जानना अच्छा है, धन्यवाद। ओएस एक्स (10.8.2 के रूप में) अभी भी 3.2.48 का उपयोग करता है, और http://stackoverflow.com/questions/10418616/does-darwin-macos-modify-bash मुझे बताता है कि, दुर्भाग्य से, "ऐप्पल काफी पुराने संस्करण का उपयोग करता है बैश के रूप में, क्योंकि वे जीपीएल 3 के तहत लाइसेंस प्राप्त कोड नहीं भेजते हैं। " – mklement0

1

, तो आप इस तरह कुछ करने कर सकते हैं:

declare -a a=() 
a+=('foo' 'bar')