unsetloạ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 numberskhô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 akhô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 numbersmả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ử 4và 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 numbersvớ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, 4bị 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 namelà một mảng, hoặc unset name[subscript], nơi subscriptlà * hay @, loại bỏ toàn bộ mảng.