2010-01-06 17 views
38

मैं एक बैश स्क्रिप्ट में स्ट्रिंग मान एकत्र करने की कोशिश कर रहा हूं। सबसे आसान तरीका है कि मैं स्ट्रिंग मानों को किसी सूची या सरणी संरचना में जोड़ सकता हूं जैसे कि मैं उन्हें अंत में बाहर निकाल सकता हूं?बैश में परिवर्तनीय सूची या सरणी संरचना? मैं इसे आसानी से कैसे जोड़ सकता हूं?

उत्तर

74
$ arr=(1 2 3) 
$ arr+=(4) 
$ echo ${arr[@]} 
1 2 3 4 

चूंकि बैश स्पैर सरणी का उपयोग करता है, इसलिए आपको इंडेक्स के रूप में तत्व गणना ${#arr} का उपयोग नहीं करना चाहिए। आप फिर भी, इस तरह के सूचकांक की एक सरणी प्राप्त कर सकते हैं:

$ indices=(${!arr[@]}) 
+1

धन्यवाद! यह मैंने देखा है कि कुछ कोड से बहुत आसान लग रहा है ... – Joe

8
foo=(a b c) 
foo=("${foo[@]}" d) 
for i in "${foo[@]}"; do echo "$i" ; done 
2

बैश में एक सरणी के अंत तक जोड़कर के लिए नहीं बल्कि अस्पष्ट वाक्य रचना है:

myarr[${#myarr[*]}]=”$newitem” 
+0

डेनिस विलियमसन के उत्तर के मुताबिक, कुछ मामलों में यह गलत है; बैश सरणी स्पैस हैं, और सूचकांक $ {# myarr [*]} अंतिम सूचकांक नहीं हो सकता है। –

2

को जोड़ने के लिए क्या इग्नेसियो एक और जवाब में सुझाव दिया है:

foo=(a b c) 
foo=("${foo[@]}" d) # push element 'd' 

foo[${#foo[*]}]="e" # push element 'e' 

for i in "${foo[@]}"; do echo "$i" ; done 
1
$ for i in "string1" "string2" "string3" 
> do 
> array+=($i) 
> done 
$ echo ${array[@]} 
string1 string2 string3 
0

हालांकि सवाल के जवाब दिए और सुंदर पुराना है, मैं एक नाम स्थान-समाधान साझा करना चाहते हैं के रूप में यह किसी भी अन्य की तुलना में काफी तेजी से काम करता है ennukiller के उत्तर को छोड़कर तरीकों (मेरे 100k लाइन परीक्षणों पर यह मेरे ~ 14 सेकेंड के खिलाफ ~ 12 सेकेंड जीता, जबकि सूची-एपेंड समाधान में कुछ मिनट लगेंगे)।

आप निम्न चाल का उपयोग कर सकते हैं:

# WORKS FASTER THAN THESE LAME LISTS! ! ! 
size=0;while IFS= read -r line; do 
    echo $line 
    ((++size)) 
    eval "SWAMP_$size='$line'" 
done 

या आप निम्न कार्य कर सकते हैं:

#!/bin/bash 
size=0 
namespace="SWAMP" 

ArrayAppend() { 
    namespace="$1" 
    # suppose array size is global 
    new_value="$2" 
    eval "${namespace}_$size='$2'" 
    eval "echo \$${namespace}_$size" 
    ((++size)) 
} 

ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 
ArrayAppend "$namespace" "$RANDOM" 

जब तक दुभाषिया टैग सूची में है, यहाँ object oriented bash के लिए एक कड़ी है।

+0

असाइनमेंट के लिए 'eval' का उपयोग न करें (विशेष रूप से उपयोगकर्ता इनपुट पर)! ** आपका कोड कोड इंजेक्शन के अधीन है और अत्यधिक असुरक्षित ** (और इसलिए टूटा हुआ) है! तो ... यह लंग सूची की तुलना में भी कम है ':) '। –

+0

वैसे, यदि आपका एकमात्र लक्ष्य आपकी फ़ाइल लाइन को सरणी में लाइन से घुमाने के लिए है, तो Bash≥4 के साथ आपको 'mapfile':' mapfile -t lines

+0

हालांकि, यदि आप पूछते हैं, तो मैं आपको 'eval' सुरक्षित रूप से उपयोग करने का एक बहुत ही कम ज्ञात तरीका दिखा सकता हूं ... –

संबंधित मुद्दे