unset
loại bỏ một yếu tố Nó không đánh số lại các yếu tố còn lại.
Chúng ta có thể sử dụng declare -p
để xem chính xác những gì xảy ra numbers
:
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Quan sát numbers
không còn có một yếu tố 4
.
Một vi dụ khac
Quan sát:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
Mảng a
không có phần tử 2 đến 21. Bash không yêu cầu các chỉ số mảng liên tiếp.
Phương pháp được đề xuất để buộc đánh số lại các chỉ số
Hãy bắt đầu với numbers
mảng có phần tử bị thiếu 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Nếu chúng ta muốn các chỉ số thay đổi, thì:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Bây giờ có một số phần tử 4
và nó có giá trị 69
.
Phương pháp thay thế để loại bỏ một phần tử & đánh số lại mảng trong một bước
Một lần nữa, hãy xác định numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
Theo đề xuất của Toby Speight trong các bình luận, một phương pháp để loại bỏ phần tử thứ tư và đánh số lại các phần tử còn lại trong một bước:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
Như bạn có thể thấy, phần tử thứ tư đã bị xóa và tất cả các phần tử còn lại được đánh số lại.
${numbers[@]:0:4}
mảng lát numbers
: phải mất bốn phần tử đầu tiên bắt đầu bằng phần tử 0.
Tương tự, ${numbers[@]:5}
lát mảng numbers
: nó lấy tất cả các phần tử bắt đầu bằng phần tử 5 và tiếp tục đến cuối mảng.
Lấy các chỉ số của một mảng
Các giá trị của một mảng có thể được lấy bằng ${a[@]}
. Để tìm các chỉ số (hoặc khóa ) tương ứng với các giá trị đó, hãy sử dụng ${!a[@]}
.
Ví dụ, hãy xem xét lại mảng của chúng tôi numbers
với phần tử bị thiếu 4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
Để xem chỉ số nào được chỉ định:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
Một lần nữa, 4
bị thiếu trong danh sách các chỉ số.
Tài liệu
Từ man bash
:
Nội dung unset
được sử dụng để phá hủy các mảng. unset name[subscript]
phá hủy phần tử mảng tại chỉ mục subscript
. Các chỉ số âm cho các mảng được lập chỉ mục được diễn giải như mô tả ở trên. Phải cẩn thận để tránh các tác dụng phụ không mong muốn gây ra bởi việc mở rộng tên đường dẫn. unset name
, Nơi name
là một mảng, hoặc unset name[subscript]
, nơi subscript
là *
hay @
, loại bỏ toàn bộ mảng.