2016-04-27 13 views
5

Ich versuche, eine Reihe von drei Werten einer Variablen zugewiesen werden, wenn sie noch nicht mit der LinieBash Array Wert in Standardwert Zuordnung

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

Leider zugewiesen wurde, Echo ${SEAFILE_MYSQL_DB_NAMES[@]} Ergebnisse in (ccnet-db seafile-db seahub-db) und ${SEAFILE_MYSQL_DB_NAMES[2]} druckt nichts. Es scheint, der Wert wurde als String und nicht als Array interpretiert. Gibt es eine Möglichkeit, wie ich meinem Skript auf diese Weise ein Array zuweisen kann?

Dieses Problem tritt auf einem Debian Jessie mit bash 4.3.30 (in einem Docker-Container, wenn das wichtig ist). Interessanterweise funktioniert derselbe Code auf Ubuntu 16.04 mit der Bash-Version 4.3.42, wo er wie ein Array behandelt wird, wie ich es erwarten würde.

+1

Sind Sie sicher, dass dies auf Ihrem Ubuntu-Rechner funktioniert? Ich habe es gerade auf meinem Debian-Unstable-Rechner mit 'GNU bash, Version 4.3.42 (1) -Release 'versucht und es hat nicht so funktioniert, wie du gesagt hast, dass du es erwartest/gesehen hast. Das alles sagte ich bin mir nicht sicher, ob ich überhaupt erwarten würde, dass das überhaupt funktioniert. Array-Zuweisung ist nicht identisch mit der ': ='/'=' -Erweiterung. –

+0

@EtanReisner Du hast recht, beim Testen muss es einen Fehler gemacht haben, es verhält sich auf dem Ubuntu-Rechner genauso. Was meinst du genau mit "Array-Zuweisung ist nicht dasselbe wie die': =/= 'Expansion"? Ich würde annehmen, dass das Zuweisen eines Wertes in dem Default-Wert-Konstrukt dasselbe ist, als wenn man es einfach dem normalen Weg zuweist (dh SEAFILE_MYSQL_DB_NAMES = (ccnet-db seafile-db seehub-db) ergibt eine Array-Variable) – RikuXan

+0

= Expansion ist nicht dasselbe wie eine einfache Zuweisung. Es gibt keinen Grund anzunehmen, dass sie genauso arbeiten müssen. Normale Array-Zuweisung ist eine bestimmte "zusammengesetzte Zuweisung". Nichts besagt, dass die ': =' -Erweiterung die gleiche zusammengesetzte Zuweisung unterstützen muss. Es könnte sicherlich * so funktionieren, aber ich glaube nicht, dass es eine notwendige Voraussetzung ist. –

Antwort

2

Wie wäre es mit mehreren Schritten? Deklarieren Sie zuerst das Fallback-Array, prüfen Sie, ob SEAFILE_MYSQL_DB_NAMES gesetzt ist, und weisen Sie es bei Bedarf zu.

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

auf this answer Basierend.

+1

Dies funktioniert nicht - 'SEAFILE_MYSQL_DB_NAMES' ist auf' DBS' und nicht auf '(ccnet-db seafile-db seahub-db)' gesetzt. – kgadek

+1

Fehler behoben, danke! – dimid

+0

oops, die immer noch eine Zeichenfolge anstelle eines Arrays zurückgibt, habe ich jetzt einen anderen Ansatz verwendet. – dimid