Trang man Bash mô tả việc sử dụng ${!a}
để trả về nội dung của biến có tên là nội dung của a
(một mức độ không xác định).
Tôi muốn biết làm thế nào để trả về tất cả các phần tử trong một mảng bằng cách sử dụng cái này, nghĩa là
a=(one two three)
echo ${a[*]}
trả lại
one two three
Tôi muốn cho:
b=a
echo ${!b[*]}
để trả lại như cũ. Thật không may, nó không, nhưng 0
thay vào đó trở lại .
Cập nhật
Đưa ra các câu trả lời, bây giờ tôi nhận ra rằng ví dụ của tôi quá đơn giản, vì dĩ nhiên, một cái gì đó như:
b=("${a[@]}")
Sẽ đạt được chính xác những gì tôi nói tôi cần.
Vì vậy, đây là những gì tôi đã cố gắng làm:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Tất nhiên, đọc kỹ trang man Bash cho thấy điều này sẽ không hoạt động như mong đợi vì dòng cuối cùng chỉ trả về các chỉ số của "mảng" $_LIST
(hoàn toàn không phải là một mảng).
Trong mọi trường hợp, sau đây nên thực hiện công việc (như đã chỉ ra):
LIST=($(eval echo \${$_LIST[*]}))
hoặc ... (tuyến đường mà tôi đã đi, cuối cùng):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Tất nhiên, giả sử rằng các phần tử không chứa khoảng trắng.
[@]
vào con trỏ_LIST="LIST_${whichone}[@]"
và sau đó, sử dụngLIST=("${!_LIST}")
để sao chép mảng. Đó là một ý tưởng tốt để sử dụng tên biến chữ thường để tránh xung đột với biến môi trường (Tất cả chữ hoa).