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 .

776voto

Nicholas Sushkin Punkte 11780

Eine 100% reine Bash-Funktion, die mehrstellige Begrenzungszeichen unterstützt, ist:

function join_by {
  local d=${1-} f=${2-}
  if shift 2; then
    printf %s "$f" "${@/#/$d}"
  fi
}

Zum Beispiel,

join_by , a b c #a,b,c
join_by ' , ' a b c #a , b , c
join_by ')|(' a b c #a)|(b)|(c
join_by ' %s ' a b c #a %s b %s c
join_by $'\n' a b c #a<newline>b<newline>c
join_by - a b c #a-b-c
join_by '\' a b c #a\b\c
join_by '-n' '-e' '-E' '-n' #-e-n-E-n-n
join_by , #
join_by , a #a

Der obige Code basiert auf den Ideen von @gniourf_gniourf, @AdamKatz, @MattCowell, und @x-yuri. Er funktioniert mit den Optionen errexit ( set -e ) und nounset ( set -u ).

Alternativ wäre eine einfachere Funktion, die nur ein einziges Zeichen als Trennzeichen unterstützt, die folgende:

function join_by { local IFS="$1"; shift; echo "$*"; }

Zum Beispiel,

join_by , a "b c" d #a,b c,d
join_by / var local tmp #var/local/tmp
join_by , "${FOO[@]}" #a,b,c

Diese Lösung basiert auf dem ursprünglichen Vorschlag von Pascal Pilz.

Eine ausführliche Erläuterung der hier vorgeschlagenen Lösungen finden Sie in "How to join() array elements in a bash script", ein Artikel von meleu unter dev.to .

288voto

doesn't matters Punkte 2487

Eine andere Lösung:

#!/bin/bash
foo=('foo bar' 'foo baz' 'bar baz')
bar=$(printf ",%s" "${foo[@]}")
bar=${bar:1}

echo $bar

Bearbeiten: dasselbe, aber für mehrstellige Trennzeichen variabler Länge:

#!/bin/bash
separator=")|(" # e.g. constructing regex, pray it does not contain %s
foo=('foo bar' 'foo baz' 'bar baz')
regex="$( printf "${separator}%s" "${foo[@]}" )"
regex="${regex:${#separator}}" # remove leading separator
echo "${regex}"
# Prints: foo bar)|(foo baz)|(bar baz

285voto

Pascal Pilz Punkte 2137
$ foo=(a "b c" d)
$ bar=$(IFS=, ; echo "${foo[*]}")
$ echo "$bar"
a,b c,d

78voto

martin clayton Punkte 74309

Vielleicht, zum Beispiel,

SAVE_IFS="$IFS"
IFS=","
FOOJOIN="${FOO[*]}"
IFS="$SAVE_IFS"

echo "$FOOJOIN"

51voto

Nil Geisweiller Punkte 3953

Keine externen Befehle verwenden:

$ FOO=( a b c )     # initialize the array
$ BAR=${FOO[@]}     # create a space delimited string from array
$ BAZ=${BAR// /,}   # use parameter expansion to substitute spaces with comma
$ echo $BAZ
a,b,c

Achtung, es wird davon ausgegangen, dass die Elemente keine Leerzeichen haben.

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