Ich versuche, ein assoziatives Array mit der Ausgabe eines Befehls zu füllen. Ich kann es tun, ohne einen Befehl wie:Wie bevölkere ich ein bash-assoziatives Array mit Befehlsausgabe?
$ declare -A x=([first]=foo [second]=bar)
$ echo "${x[first]}, ${x[second]}"
foo, bar
und ich kann ein nicht-assoziatives Array mit Befehlsausgabe als bevölkern:
$ declare y=($(echo 'foo bar'))
$ echo "${y[0]}, ${y[1]}"
foo, bar
aber wenn ich versuche, auf beide oben zu bauen zu erstellen eine Aussage, die ein assoziatives Array von einem Befehl bevölkern, ich die folgende Fehlermeldung erhalten:
$ declare -A z=($(echo '[first]=foo [second]=bar'))
-bash: z: $(echo '[first]=foo [second]=bar'): must use subscript when assigning associative array
Warum bin ich die Fehlermeldung bekommen und was ist die richtige Syntax eines assoziativen zu füllen Array mit der Ausgabe eines Befehls? Ich versuche zu vermeiden, eval
für the usual reasons zu verwenden, möchte nicht eine temporäre Datei verwenden, und natürlich echo
wird nur als ein Beispiel für einen Befehl verwendet, der den fraglichen Effekt erzeugt, der echte Befehl wird komplizierter.
So, basierend auf ein paar der folgenden Antworten, es sieht aus wie es war meine nur zitiert, dass ein Problem war:
$ declare -A z="($(echo '[first]=foo [second]=bar'))"
$ echo "${z[first]}, ${z[second]}"
foo, bar
und mit Leerzeichen in den Indizes und Werte:
$ declare -A z="($(echo '[first field]="foo with space" [second]="space bar"'))"
$ echo "${z[first field]}, ${z[second]}"
foo with space, space bar
Das könnte funktionieren. Wir müßten ein 'IFS =' hinzufügen und wir können '$ '...' nicht um die ganze Sache herum verwenden oder es würde '\ t' in einen Tab usw. konvertieren, aber wir könnten es wahrscheinlich Erhalten Sie Literal-Zeilenumbrüche oder sogar NUL-Zeichen (und lesen Sie mit NUL-Flag) zwischen jedem Array-Element. Muss auch darüber nachdenken, danke! –
Ich wurde einmal auf SO gesagt, dass 'IFS =' nicht benötigt wird, wenn wir interne '$ REPLY'-Variable verwenden, aber es schadet nicht, sie zu benutzen, denke ich. (bearbeitet) – anubhava
Hmm, die Zeilenumbrüche machen eigentlich keinen Unterschied bei der Trennung der Werte. Das Skript funktioniert, wenn die Werte nur durch Leerzeichen getrennt sind. Der Printf benötigt nur einen Zeilenumbruch am Ende. –