2016-04-27 18 views
5

Sto cercando di assegnare una matrice di tre valori ad una variabile se non è stato ancora assegnato con la lineavalore Array Bash nell'assegnazione valore predefinito

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

Sfortunatamente, facendo eco ${SEAFILE_MYSQL_DB_NAMES[@]} risultati in (ccnet-db seafile-db seahub-db) e ${SEAFILE_MYSQL_DB_NAMES[2]} non stampa nulla. Sembra che il valore sia stato interpretato come una stringa e non come una matrice. C'è un modo per far sì che il mio script assegni un array in questo modo?

Questo problema si verifica su un Debian Jessie con bash 4.3.30 (in un contenitore di finestra mobile se ciò è importante). È interessante notare che lo stesso codice funziona su Ubuntu 16.04 con la versione 4.3.42 di bash, dove viene gestito come un array come mi aspetterei.

+1

Sei sicuro che funzioni sulla tua macchina Ubuntu? L'ho appena provato sulla mia macchina debian unstable con 'GNU bash, versione 4.3.42 (1) -release' e ​​non ha funzionato nel modo in cui hai detto che ti aspetti/visto. Tutto ciò ha detto che non sono sicuro che mi aspetterei che funzioni in primo luogo. L'assegnazione delle matrici non è la stessa dell'espansione ': ='/'='. –

+0

@EtanReisner Hai ragione, devi aver fatto un errore durante il test, si comporta allo stesso modo sulla macchina Ubuntu. Cosa intendi esattamente con "L'assegnazione delle matrici non è la stessa di:: =/=' espansione "? Assumerei che l'assegnazione di un valore nel costrutto del valore di default sia la stessa di quando si assegna semplicemente il modo normale (es. 'SEAFILE_MYSQL_DB_NAMES = (ccfile-db seafile-db seahub-db) 'restituisce una variabile di matrice) – RikuXan

+0

' ': = 'l'espansione non è la stessa cosa di un semplice compito. Non c'è motivo di supporre che debbano lavorare allo stesso modo. L'assegnazione normale dell'array è una specifica "assegnazione composta" nulla dice che l'espansione ': =' deve supportare la stessa assegnazione composta. Certamente * potrebbe * funzionare in questo modo ma non penso che sia un'ipotesi/estensione necessaria che sarebbe. –

risposta

2

Che ne dici di farlo in più fasi? Prima dichiarare l'array fallback, quindi verificare se è impostato SEAFILE_MYSQL_DB_NAMES e assegnarlo se necessario.

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

Basato su this answer.

+1

Questo non funziona-'SEAFILE_MYSQL_DB_NAMES' è impostato su 'DBS' e non su' (ccnet-db seafile-db seahub-db) '. – kgadek

+1

risolto, grazie! – dimid

+0

oops, che restituisce ancora una stringa invece di un array, ho usato un approccio diverso ora. – dimid