Một điều cần lưu ý là bash
các mảng được triển khai như ksh
, đó là các mảng kết hợp trong đó các khóa được giới hạn ở các số nguyên dương (trái với các ngôn ngữ khác như perl
hoặc zsh
ví dụ).
Trong:
a[123]=foo a[456]=bar a[789]=baz
Trong bash, bạn đã có một mảng kết hợp với 3 phần tử, trong khi đó perl
, bạn sẽ có một mảng với 790 phần tử (789 với zsh).
Trong ksh
hoặc bash
, ${a[@]:0:1}
trả về phần tử đầu tiên của mảng trong danh sách các phần tử được sắp xếp theo số theo khóa trong đó khóa lớn hơn hoặc bằng 0. Vì vậy, trong trường hợp đó, nó trả về ${a[123]}
, không ${a[0]}
.
unset 'a[123]'
(hãy nhớ trích dẫn nó, nếu không sẽ thất bại nếu có một tệp có tên a1 hoặc a2 hoặc a3 trong thư mục hiện tại) có ý nghĩa, vì nó loại bỏ một khóa cụ thể trong mảng.
unset 'a[@]::2'
làm cho ít ý nghĩa hơn mặc dù. bash
chỉ hiểu unset a
, unset 'a[123]'
hoặc unset 'a[*/@]'
, bất cứ điều gì sau khi bị bỏ qua, vì vậy unset 'a[@]::2'
và unset 'a[@]please'
làm tương tự: bỏ đặt toàn bộ mảng.
Nếu bạn muốn hủy đặt một loạt các phím, bạn cần lặp qua các phím:
Để có được danh sách các khóa của mảng, cú pháp là "${!a[@]}"
. Thật không may, áp dụng một phạm vi cho điều đó không hoạt động với bash
cũng không ksh
, vì vậy bạn cần một mảng tạm thời:
keys=("${!a[@]}")
for i in "${keys[@]::2}"; do unset "a[$i]"; done
Bây giờ nếu bạn muốn xem xét các mảng như trong các ngôn ngữ khác, bạn không muốn sử dụng unset
. Giống như, nếu mảng đầu tiên không thưa thớt và bạn muốn giữ nó như vậy (đó là thay đổi tất cả các phần tử bằng 2 thay vì bỏ chọn hai phần đầu), bạn có thể thực hiện những việc như:
a=("${a[@]:2}")
Đó là gán lại mảng với danh sách các yếu tố bạn muốn giữ.
Để so sánh, với zsh
.
a=({1..20})
unset 'a[12,16]'
sẽ đặt một giá trị trống cho các phần tử 12 đến 16. trong khi unset 'a[16,20]'
sẽ thu nhỏ mảng thành 15 phần tử.
a=({1..20})
a[12,16]=()
(vẫn với zsh
) sẽ thay đổi các yếu tố 17 đến 20 bởi 5 vị trí a[12]
sẽ chứa 17
.