Bagaimana cara menambah / menghapus elemen ke / dari array di bash?

Jawaban:

50

Untuk menambahkan elemen ke awal penggunaan array.

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

Secara umum, Anda akan melakukannya.

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

Untuk menambahkan elemen ke akhir penggunaan array.

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

Atau sebaliknya

arr+=( "new_element" )

Secara umum, Anda akan melakukannya.

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

Untuk menambahkan elemen ke indeks spesifik penggunaan array.

Katakanlah kita ingin menambahkan elemen ke posisi Index2 arr [2] , kita sebenarnya akan melakukan penggabungan pada sub-array di bawah ini:

  1. Dapatkan semua elemen sebelum Index position2 arr [0] dan arr [1] ;
  2. Tambahkan elemen ke array;
  3. Dapatkan semua elemen dengan Indeks posisi2 ke arr terakhir [2] , arr [3] , ....

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

Menghapus elemen dari array

Selain menghapus elemen dari array (misalkan elemen # 2), kita perlu menggabungkan dua sub-array. Sub-array pertama akan menahan elemen sebelum elemen # 2 dan sub-array kedua akan berisi elemen setelah elemen # 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}akan mendapatkan dua elemen arr [0] dan arr [1] dimulai dari awal array.
  • ${arr[@]:3}akan mendapatkan semua elemen dari index3 arr [3] hingga yang terakhir.

Kemungkinan lain untuk menghapus elemen adalah

  1. Menggunakan unset(sebenarnya menetapkan nilai 'null' ke elemen)

    unset arr[2]
  2. Gunakan ganti pola jika Anda tahu nilai elemen Anda.

    arr=( "${arr[@]/PATTERN/}" )
αғsнιη
sumber
2
Perhatikan bahwa kecuali untuk arr+=(element)dan unset arr[2](yang seharusnya unset -v 'arr[2]'!), Yang mengasumsikan array non-sparse. Perhatikan juga bahwa arr=( "${arr[@]/PATTERN/}" )tidak mengubah jumlah elemen. Yang bisa dilakukan hanyalah menggantinya dengan string kosong.
Stéphane Chazelas
jadi untuk menghapus bagian untuk bekerja, Anda harus menemukan indeks, kan? apa cara tercepat untuk menemukannya?
qodeninja
3

Perhatikan bahwa array dalam bash(disalin dari ksh) adalah array yang lebih asosiatif.

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

akan membuat $aarray baru dengan newvalueas ${a[0]}dan elemen-elemen dari array asli ditambahkan dalam urutan numerik kunci mereka dengan tombol 1, 2 ...

Misalnya, jika Anda memiliki:

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

Itu menjelaskan mengapa tidak ada operator builtin untuk itu.

Jika Anda ingin menyisipkan newvalueas ${a[0]}dan menggeser semua kunci lainnya dengan satu, Anda memerlukan larik sementara:

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

Kerang seperti zshatau yashyang memiliki susunan normal memiliki operator untuk itu:

  • zsh:

    a[1,0]=newvalue

    (juga berfungsi untuk menambahkan string ke variabel skalar)

  • yash:

    array -i a 0 newvalue
Stéphane Chazelas
sumber
1
"array dalam bash (disalin dari ksh) adalah array yang asosiatif" ?? Saya pikir ada array "reguler" (mungkin jarang) dan asosiatif (di mana Anda dapat menggunakan string sebagai tidak senonoh) dalam bash, apa yang saya lewatkan?
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  
}
Mahendra
sumber