2016-11-10 3 views
2

ich meinen Anwendungsfall für diese 3 Zeilen gestrippt (plus dem Ausgang):Warum überschreibt Bash mein Array nicht mit einem neuen?

A=(foo bar) 
A=$(echo "spam egg") 
echo ${A[@]} 
spam egg bar 

es ein Array mit zwei Elementen von Hand geschrieben schafft. Einige Zeit später möchte ich mein Array durch die Ausgabe eines Befehlszeilentools ersetzen (z. B. ls *.vhd). Anstatt das Array zu ersetzen, ersetzt Bash nur das erste Element, sodass der Balken am Ende "angehängt" wird.

Wenn ich ein anderes handgeschriebenes Array verwende, kann ich dieses Verhalten nicht reproduzieren.

A=(foo bar) 
A=(spam egg) 
echo ${A[@]} 
spam egg 

So vermute ich es mit $() in engem Zusammenhang steht. Wie kann ich mein Problem lösen?

+1

'A = $ (echo" Spam-Ei ")' ist äquivalent zu 'A [0] = $ (echo" Spam-Ei ")'. – chepner

Antwort

4

Verwenden Klammern in der Aufgabenstellung, so dass es als eine Anordnung behandelt wird, anstatt eine lange Zeichenfolge mit Leerzeichen:

A=$(echo "spam egg") 
echo ${A[0]} 

->spam egg

A=($(echo "spam egg")) 
echo ${A[0]} 

->spam

(Die Klammern für $(), die bash sagen, einen Befehl auszuführen, nicht Zählen Sie auch, dass das Ergebnis als Array erfasst wird.)

+0

Indizierung funktioniert nicht mit regulären Zeichenfolgen. '$ {A [1]}' wäre in Ihrem ersten Beispiel nicht "s". – chepner

+0

Ah, Entschuldigung! Ich habe die Beispiele in 'zsh' geschrieben, obwohl der Hauptpunkt, Parens zu benötigen, immer noch besteht. Ändere zu: 'A = ($ (echo" spam ei ")); echo $ {A [0]} -> spam' für 'bash' –

+1

Es wäre nett, Ihre Antwort zu aktualisieren, um relevanten' bash' Code anzuzeigen. – chepner

Verwandte Themen