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
.
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
.
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 .
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
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 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.