585 Stimmen

Wie kann ich Elemente eines Arrays in der Bash verbinden?

Wenn ich ein Array wie dieses in Bash habe:

FOO=( a b c )

Wie verbinde ich die Elemente mit Kommas? Zum Beispiel, indem ich a,b,c .

4voto

Zombo Punkte 1
$ set a 'b c' d

$ history -p "$@" | paste -sd,
a,b c,d

4voto

guest Punkte 41

Kombinieren Sie das Beste aus allen bisherigen Welten mit folgender Idee.

# join with separator
join_ws()  { local IFS=; local s="${*/#/$1}"; echo "${s#"$1$1$1"}"; }

Dieses kleine Meisterwerk ist

  • 100% reine Bash ( Parametererweiterung mit IFS temporär ungesetzt, keine externen Aufrufe, kein printf ... )
  • kompakt, vollständig und fehlerfrei ( funktioniert mit ein- und mehrstelligen Begrenzern, funktioniert mit Begrenzern, die Leerzeichen, Zeilenumbrüche und andere Shell-Sonderzeichen enthalten, funktioniert mit leeren Begrenzern )
  • effizient ( keine Subshell, keine Array-Kopie )
  • einfach und dumm und bis zu einem gewissen Grad auch schön und lehrreich

Beispiele:

$ join_ws , a b c
a,b,c
$ join_ws '' a b c
abc
$ join_ws $'\n' a b c
a
b
c
$ join_ws ' \/ ' A B C
A \/ B \/ C

3voto

Guss Punkte 27060

Hier ist eine einzelne Zeile, die ein bisschen seltsam ist, aber gut für mehrstellige Begrenzungszeichen funktioniert und jeden Wert unterstützt (einschließlich Leerzeichen oder irgendetwas):

ar=(abc "foo bar" 456)
delim=" | "
printf "%s\n$delim\n" "${ar[@]}" | head -n-1 | paste -sd ''

Dies würde in der Konsole wie folgt angezeigt

abc | foo bar | 456

Nota: Beachten Sie, dass einige Lösungen die printf をもって ${ar[*]} und einige mit ${ar[@]} ?

Diejenigen mit @ verwenden Sie die printf Funktion, die mehrere Argumente durch Wiederholung der Formatvorlage unterstützt.

Diejenigen mit * sollte nicht verwendet werden . Sie brauchen eigentlich nicht printf und verlassen sich auf die Manipulation des Feldtrenners und die Worterweiterung der Bash. Diese würden genauso gut funktionieren mit echo , cat , usw. - Diese Lösungen verwenden wahrscheinlich printf weil der Autor nicht wirklich versteht, was er da tut...

3voto

mattalxndr Punkte 8330

Ich glaube, dies ist die kürzeste Lösung, denn Benamin W. bereits erwähnt:

(IFS=,; printf %s "${a[*]}")

Ich wollte noch hinzufügen, dass Sie die Subshell weglassen können, wenn Sie zsh verwenden:

IFS=, printf %s "${a[*]}"

Test:

a=(1 'a b' 3)
IFS=, printf %s "${a[*]}"
1,a b,3

2voto

Ben Davis Punkte 11835

Mein Versuch.

$ array=(one two "three four" five)
$ echo "${array[0]}$(printf " SEP %s" "${array[@]:1}")"
one SEP two SEP three four SEP five

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X