ব্যাশ-এ অ্যারে থেকে / এলিমেন্টে কীভাবে একটি উপাদান যুক্ত / সরানো যায়?


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] , আর [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}সূচক 3 টি থেকে [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[@]")

আসল অ্যারের উপাদানগুলি কীগুলির 1, 2 দিয়ে তাদের কীগুলির সংখ্যাগত ক্রমে সংযুক্ত করা হবে এবং এর $aসাথে একটি নতুন অ্যারে তৈরি করবে ...newvalue${a[0]}

উদাহরণস্বরূপ, যদি আপনি:

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]}এবং এক দ্বারা সব অন্যান্য shift কীগুলি, আপনি একটি অস্থায়ী অ্যারে প্রয়োজন চাই:

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
"বাশ-এ অ্যারে (কেএসএস থেকে অনুলিপি করা) বরং সংঘবদ্ধ অ্যারে" ?? আমি ভেবেছিলাম "নিয়মিত" (সম্ভবত সম্ভব বিচ্ছিন্ন) এবং এসোসিয়েটিভ (যেখানে আপনি স্ট্রাইসকে ইন্ডিকেস হিসাবে ব্যবহার করতে পারেন) বাশগুলিতে অ্যারে রয়েছে, আমি কী মিস করছি?

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