Làm cách nào để thêm / xóa một phần tử đến / từ mảng trong bash?


Câu trả lời:


48

Để thêm một phần tử vào đầu sử dụng mảng.

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

Nói chung, bạn sẽ làm.

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

Để thêm một phần tử vào cuối của một mảng sử dụng.

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

Hoặc thay vào đó

arr+=( "new_element" )

Nói chung, bạn sẽ làm.

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

Để thêm một phần tử vào chỉ mục cụ thể của một mảng sử dụng.

Giả sử chúng ta muốn thêm một phần tử vào vị trí của mảng Index2 [2] , chúng ta thực sự sẽ hợp nhất trên các mảng con bên dưới:

  1. Nhận tất cả các phần tử trước Index Position2 Array [0]Array [1] ;
  2. Thêm một phần tử vào mảng;
  3. Nhận tất cả các phần tử với Index location2 đến mảng cuối cùng [2] , mảng [3] , ....

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

Loại bỏ một phần tử khỏi mảng

Ngoài việc loại bỏ một phần tử khỏi một mảng (giả sử phần tử # 2), chúng ta cần nối hai mảng con. Mảng con đầu tiên sẽ giữ các phần tử trước phần tử # 2 và mảng con thứ hai sẽ chứa các phần tử sau phần tử # 2.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}sẽ nhận được hai phần tử mảng [0] và mảng [1] bắt đầu từ đầu mảng.
  • ${arr[@]:3}sẽ nhận được tất cả các phần tử từ mảng index3 [3] đến cuối cùng.

Một khả năng khác để loại bỏ một yếu tố là

  1. Sử dụng unset(thực sự gán giá trị 'null' cho phần tử)

    unset arr[2]
  2. Sử dụng mô hình thay thế nếu bạn biết giá trị của các yếu tố của bạn.

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

2
Lưu ý rằng ngoại trừ arr+=(element)unset arr[2](nên là unset -v 'arr[2]'!), Giả sử các mảng không thưa thớt. Cũng lưu ý rằng arr=( "${arr[@]/PATTERN/}" )không thay đổi số lượng phần tử. Tất cả những gì nó có thể làm là thay thế chúng bằng chuỗi rỗng.
Stéphane Chazelas

Vì vậy, để phần gỡ bỏ hoạt động, bạn phải tìm chỉ mục, phải không? cách nhanh nhất để tìm thấy nó là gì?
qodeninja

3

Lưu ý rằng các mảng trong bash(được sao chép từ ksh) là các mảng khá liên kết.

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

sẽ làm cho một mới $amảng với newvaluenhư ${a[0]}và các yếu tố của mảng ban đầu nối theo thứ tự số của chính họ với các phím 1, 2 ...

Chẳng hạn, nếu bạn có:

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

Điều đó giải thích tại sao không có toán tử dựng sẵn cho điều đó.

Nếu bạn muốn chèn newvalueas ${a[0]}và dịch chuyển tất cả các phím khác, bạn cần một mảng tạm thời:

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

Shell thích zshhoặc yashcó mảng bình thường có toán tử cho điều đó:

  • zsh:

    a[1,0]=newvalue

    (cũng hoạt động để chuẩn bị chuỗi cho biến vô hướng)

  • yash:

    array -i a 0 newvalue

1
"Mảng trong bash (được sao chép từ ksh) là các mảng khá liên kết" ?? Tôi nghĩ rằng có các mảng "thông thường" (tho có thể thưa thớt) và liên kết (nơi bạn có thể sử dụng các chuỗi như là không đứng đắn) trong bash, tôi còn thiếu gì?
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  
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.