Bir öğeyi bash içindeki diziye eklemek / kaldırmak


Yanıtlar:


47

Dizi kullanımının başına bir eleman eklemek için.

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

Genellikle yaparsın.

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

Dizi kullanımının sonuna bir eleman eklemek için.

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

Veya onun yerine

arr+=( "new_element" )

Genellikle yaparsın.

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

Dizi kullanımının belirli bir dizinine bir öğe eklemek için.

İndeks2 arr [2] pozisyonuna bir eleman eklemek istediğimizi varsayalım , aslında alt dizilerin altında birleşiriz:

  1. İndeks pozisyonu2 arr [0] ve arr [1] 'den önce tüm elemanları al ;
  2. Diziye bir öğe ekle;
  3. İndeks pozisyonu2 olan tüm elementleri son arr [2] , arr [3] , ....

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

Bir öğeyi diziden kaldırma

Bir öğeyi bir diziden kaldırmaya ek olarak (2 numaralı diyelim), iki alt diziyi birleştirmemiz gerekir. İlk alt dizi # 2 öğesinden önce elemanları tutacaktır ve ikinci alt dizi # 2 öğesinden sonra öğeleri içerecektir.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}arr [0] adlı iki eleman alır ve arr [1] dizinin başından başlar.
  • ${arr[@]:3}İndeks3 arrından [3] tüm elemanları sonuncuya kadar alacaktır .

Bir öğeyi kaldırmak için başka bir olasılık

  1. Kullanma unset(aslında öğeye 'null' değeri ata)

    unset arr[2]
  2. Elementlerinizin değerini biliyorsanız, değiştirme desenini kullanın.

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

2
Hariç unutmayın arr+=(element)ve unset arr[2](ki olmalıdır unset -v 'arr[2]'!), Seyrek olmayan diziler varsayar. Ayrıca arr=( "${arr[@]/PATTERN/}" ), öğelerin sayısını değiştirmediğini unutmayın . Tüm yapabileceği, onları boş dizeyle değiştirmek.
Stéphane Chazelas,

bu nedenle sökme kısmının çalışması için indeksi bulmanız gerekir, değil mi? onu bulmanın en hızlı yolu nedir?
qodeninja

3

Bu diziler Not bash(ksh kopyalanan) oldukça ilişkisel dizilerdir.

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

as ile ve 1, 2 tuşlarıyla tuşlarının sayısal sırasına eklenen orijinal dizinin öğelerini $aiçeren yeni bir dizi oluşturur ...newvalue${a[0]}

Örneğin, eğer olsaydı:

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")

Bu neden bunun için yerleşik bir operatör olmadığını açıklar.

newvalueAs eklemek ${a[0]}ve diğer tüm tuşları birer birer değiştirmek isterseniz, geçici bir diziye ihtiyacınız olacaktır:

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

Gibi zshveya yashnormal dizileri olan kabukları bunun için operatör var:

  • zsh:

    a[1,0]=newvalue

    (ayrıca skaler değişkenlere dizeleri hazırlamak için de çalışır)

  • yash:

    array -i a 0 newvalue

"bash dizileri (ksh'dan kopyalandı) oldukça ilişkisel dizilerdir" ?? Bash içinde "normal" (muhtemelen seyrek) ve ilişkisel (dizeleri indeks olarak kullanabileceğiniz) diziler olduğunu sanıyordum, neyi özlüyorum?
Eylül’e

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  
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.