2016-04-27 31 views
5

Tôi đang cố gắng gán một mảng trong ba giá trị cho một biến nếu nó chưa được phân công nhưng với dònggiá trị mảng Bash trong phân giá trị mặc định

: ${SEAFILE_MYSQL_DB_NAMES:=(ccnet-db seafile-db seahub-db)}

Thật không may, vang vọng ${SEAFILE_MYSQL_DB_NAMES[@]} kết quả trong (ccnet-db seafile-db seahub-db)${SEAFILE_MYSQL_DB_NAMES[2]} không in được gì. Dường như, giá trị đã được hiểu là một chuỗi và không phải là một mảng. Có cách nào tôi có thể làm cho kịch bản của tôi chỉ định một mảng theo cách này?

Sự cố này xảy ra trên Debian Jessie với bash 4.3.30 (trong vùng chứa docker nếu có vấn đề). Thật thú vị, cùng một mã hoạt động trên Ubuntu 16.04 với phiên bản bash 4.3.42, nơi nó được xử lý như một mảng như tôi mong đợi nó.

+1

Bạn có chắc chắn điều này hoạt động trên máy Ubuntu của mình không? Tôi chỉ thử nó trên máy debian không ổn định của tôi với 'GNU bash, phiên bản 4.3.42 (1) -release' và nó không hoạt động theo cách bạn nói bạn mong đợi/thấy. Tất cả đều nói rằng tôi không chắc chắn rằng tôi thậm chí có thể mong đợi điều này để làm việc ở nơi đầu tiên. Phân công mảng không giống với việc mở rộng ': ='/'='. –

+0

@EtanReisner Bạn nói đúng, phải có một sai lầm khi thử nghiệm nó, nó hoạt động giống nhau trên máy Ubuntu. Điều gì làm bạn có nghĩa là chính xác với "Array chuyển nhượng không giống như': =/= 'mở rộng"? Tôi giả định rằng gán một giá trị trong giá trị mặc định xây dựng giống như khi chỉ định đơn giản nó theo cách thông thường (tức là 'SEAFILE_MYSQL_DB_NAMES = (ccnet-db seafile-db seahub-db)' kết quả trong một biến mảng) – RikuXan

+0

': = 'mở rộng không giống như một phép gán đơn giản. Không có lý do gì để cho rằng họ phải làm việc theo cùng một cách. Việc gán mảng thông thường là một "phép gán hợp chất" cụ thể không có gì nói rằng sự mở rộng ': =' cần hỗ trợ cùng một phép gán hợp chất. Nó chắc chắn * có thể * làm việc theo cách đó nhưng tôi không nghĩ rằng đó là một giả định cần thiết/mở rộng mà nó sẽ. –

Trả lời

2

Làm thế nào để thực hiện nó trong nhiều giai đoạn? Trước tiên khai báo mảng dự phòng, sau đó kiểm tra xem SEAFILE_MYSQL_DB_NAMES có được đặt hay không và chỉ định nếu cần.

DBS=(ccnet-db seafile-db seahub-db) 
[[ -v SEAFILE_MYSQL_DB_NAMES ]] || read -ra SEAFILE_MYSQL_DB_NAMES <<< ${DBS[@]} 

Dựa trên this answer.

+1

Điều này không hoạt động — 'SEAFILE_MYSQL_DB_NAMES' được đặt thành 'DBS' và không được đặt thành' (ccnet-db seafile-db seahub-db) '. – kgadek

+1

Đã khắc phục sự cố, cảm ơn! – dimid

+0

oops, mà vẫn trả về một chuỗi thay vì một mảng, tôi đã sử dụng một cách tiếp cận khác nhau ngay bây giờ. – dimid

Các vấn đề liên quan