बैश में सरणी से / के लिए एक तत्व कैसे जोड़ें / निकालें?


43

मेरे पास कुछ तत्वों से युक्त एक सरणी है, लेकिन मैं नए आइटम को सरणी की शुरुआत में धकेलना चाहता हूं; मैं उसको कैसे करू?


जवाबों:


48

एक सरणी उपयोग की शुरुआत में एक तत्व जोड़ने के लिए।

arr=("new_element" "${arr[@]}")

आम तौर पर, आप करेंगे।

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")

किसी सरणी उपयोग के अंत में एक तत्व जोड़ने के लिए।

arr=( "${arr[@]}" "new_element" )

या इसके बजाय

arr+=( "new_element" )

आम तौर पर, आप करेंगे।

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )

किसी सरणी उपयोग के विशिष्ट सूचकांक में एक तत्व जोड़ने के लिए।

मान लें कि हम अनुक्रमणिका 2 की स्थिति में एक तत्व जोड़ना चाहते हैं [2] , हम वास्तव में उप- गिरफ्तारी के नीचे विलय करेंगे:

  1. सूचकांक स्थिति 2 को गिरफ्तार करने से पहले सभी तत्वों को प्राप्त करें [0] और गिरफ्तार [1] ;
  2. सरणी में एक तत्व जोड़ें;
  3. सूचकांक स्थिति 2 के साथ सभी तत्वों को अंतिम गिरफ्तारी [2] , गिरफ्तारी [3] ,…।

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )

किसी तत्व को सरणी से निकालना

एक सरणी से एक तत्व को हटाने के अलावा (चलो तत्व # 2 कहते हैं), हमें दो उप-सरणियों को संक्षिप्त करने की आवश्यकता है। पहला उप-सरणी तत्वों # 2 से पहले तत्वों को रखेगा और दूसरे उप-सरणी में तत्व # 2 के बाद के तत्व होंगे।

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}दो तत्वों को गिरफ्तार करेगा [0] और गिरफ्तार [1] सरणी की शुरुआत से शुरू होता है।
  • ${arr[@]:3}index3 से सभी तत्वों को गिरफ्तार किया जाएगा [3] अंतिम तक।

एक तत्व को निकालने की एक और संभावना है

  1. उपयोग करना unset(वास्तव में तत्व को 'अशक्त' मान देना)

    unset arr[2]
  2. यदि आप अपने तत्वों का मूल्य जानते हैं, तो पैटर्न बदलें का उपयोग करें।

    arr=( "${arr[@]/PATTERN/}" )

2
ध्यान दें कि ( arr+=(element)और unset arr[2]जो होना चाहिए unset -v 'arr[2]'!) को छोड़कर , गैर-विरल सरणियों को मानता है। यह भी ध्यान दें कि arr=( "${arr[@]/PATTERN/}" )तत्वों की संख्या में परिवर्तन नहीं होता है। यह सब कर सकते हैं उन्हें खाली स्ट्रिंग के साथ बदल दिया है।
स्टीफन चेजेलस

तो काम करने के लिए हटाने वाले हिस्से के लिए आपको सूचकांक ढूंढना होगा, है ना? इसे खोजने का सबसे तेज़ तरीका क्या है?
कोडीनिजा

3

ध्यान दें कि bash(ksh से कॉपी) में सरणियाँ बल्कि सहयोगी सरणियाँ हैं।

a=(newvalue "$a[@]")

एक नया बनाना होगा $aके साथ सरणी newvalueके रूप में ${a[0]}और चाबी 1, 2 के साथ उनके प्रमुख के संख्यात्मक क्रम में संलग्न मूल सरणी के तत्वों ...

उदाहरण के लिए, यदि आपके पास:

bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")

यह बताता है कि उसके लिए कोई बिल्टइन ऑपरेटर क्यों नहीं है।

यदि आप के newvalueरूप में सम्मिलित करना चाहते हैं ${a[0]}और एक-एक करके सभी अन्य कुंजियों को स्थानांतरित करना चाहते हैं, तो आपको एक अस्थायी सरणी की आवश्यकता होगी:

b=newvalue
for k in "${!a[@]}"; do
  b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
  a[k]=${b[k]}
done
unset b

गोले की तरह zshया yashजिनके पास सामान्य सरणियाँ होती हैं, उनके लिए ऑपरेटर होते हैं:

  • zsh:

    a[1,0]=newvalue

    (स्केलर चर के लिए प्रीपेड स्ट्रिंग्स के लिए भी काम करता है)

  • yash:

    array -i a 0 newvalue

1
"बैश में सरणियाँ (ksh से कॉपी) बल्कि सहयोगी सरणियाँ हैं" ?? मैंने सोचा कि "नियमित" (थो संभवतः विरल) और साहचर्य है (जहां आप स्ट्रिंग्स का इस्तेमाल अनिर्णय के रूप में कर सकते हैं) बैश में ऐरे, मुझे क्या याद आ रहा है?
nhed

0
# array declaration  
arr=()  

#Function to read data from file a and add into array  
fun_add_in_array()
{  
input=$1  
while IFS=',' read -r f1 f2  
do  
    echo "Element1 : $f1"  
    echo "Element2 : $f2"  
    arr+=( "$f1" )  
done < "$input"  
}  

#Function to print a array  
fun_read_array()  
{  
arr=("$@")  
for i in "${arr[@]}"  
do  
    echo $i  
done  
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.