Câu trả lời:
Có, có:
ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')
Trong ngữ cảnh mà một câu lệnh gán đang gán một giá trị cho biến shell hoặc chỉ mục mảng (xem Mảng), toán tử '+ =' có thể được sử dụng để chắp thêm hoặc thêm vào giá trị trước đó của biến.
ARRAY
chỉ là một giữ chỗ cho một tên biến thực tế. Ngay cả khi các chỉ số mảng của bạn không tuần tự, việc nối thêm +=
sẽ chỉ đơn giản là gán cho chỉ số cao nhất + 1.
${myarray[@]}
- tham chiếu một biến mảng như thể nó là một vô hướng giống như truy cập phần tử 0 của nó; nói cách khác: $myarray
giống như ${myarray[0]}
.
Như Dumb Guy chỉ ra, điều quan trọng cần lưu ý là mảng bắt đầu từ 0 và có tuần tự hay không. Vì bạn có thể thực hiện các bài tập và bỏ đặt các chỉ mục không liền kề ${#array[@]}
không phải lúc nào cũng là mục tiếp theo ở cuối mảng.
$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h
Đây là cách lấy chỉ mục cuối cùng:
$ end=(${!array[@]}) # put all the indices in an array
$ end=${end[@]: -1} # get the last one
$ echo $end
42
Điều đó minh họa làm thế nào để có được phần tử cuối cùng của một mảng. Bạn sẽ thường thấy điều này:
$ echo ${array[${#array[@]} - 1]}
g
Như bạn có thể thấy, bởi vì chúng ta đang xử lý một mảng thưa thớt, đây không phải là yếu tố cuối cùng. Điều này hoạt động trên cả mảng thưa thớt và tiếp giáp, mặc dù:
$ echo ${array[@]: -1}
i
${array[@]: start[:count]}
Trả về số lượng elems. hoặc, nếu không được chỉ định, tất cả các elems còn lại . bắt đầu từ elem sau: - Nếu bắt đầu> = 0: từ elem. có chỉ số> = bắt đầu. - Nếu bắt đầu <0: từ elem. có chỉ số là (chỉ số mảng cuối + 1) - abs (bắt đầu); CAVEAT: nếu abs (bắt đầu)> (chỉ mục mảng cuối + 1), chuỗi null được trả về. Nếu số lượng được chỉ định, vì nhiều phần tử được trả về, ngay cả khi các chỉ số của chúng không liền kề từ đầu.
${array[-1]}
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
arr=("${arr[@]}" "new")
nếu bạn có các yếu tố có khoảng trắng trong đó
Nếu mảng của bạn luôn tuần tự và bắt đầu từ 0, thì bạn có thể làm điều này:
array[${#array[@]}]='foo'
# gets the length of the array
${#array_name[@]}
Nếu bạn vô tình sử dụng khoảng trắng giữa các dấu bằng:
array[${#array[@]}] = 'foo'
Sau đó, bạn sẽ nhận được một lỗi tương tự như:
array_name[3]: command not found
+=
cú pháp (xem câu trả lời của @ e-t172) là (a) đơn giản hơn và (b) cũng hoạt động với các mảng không liền kề và / hoặc không bắt đầu bằng 0.
+=
được thêm vào, ví dụ phiên bản 2
$arr += ($el)
dường như phân tách chuỗi theo khoảng trắng và thêm từng phần tử.
Với một mảng được lập chỉ mục, bạn có thể làm một cái gì đó như thế này:
declare -a a=()
a+=('foo' 'bar')