String-Substitution zum Kombinieren von Arrays verwenden?

String-Substitution zum Kombinieren von Arrays verwenden?

Ich versuche, ein Array durch String-Substitution zu kombinieren. Ausgabe:

a,b,c

Das Folgende funktioniert, aber gibt es keine Möglichkeit, ohne Piping auszukommen?

#!/bin/bash

words=(a b c)

echo "${words[@]}" | sed 's/ /,/g'

Ich habe das versucht, es funktioniert nicht.

echo "${words[@]// /,/}"

Antwort1

Wenn Sie eine Zeichenfolge ausgeben möchten, die aus den Elementen eines Arrays besteht, die durch ein bestimmtes Zeichen getrennt sind, verwenden Sie

words=(a b c)

( IFS=,; printf '%s\n' "${words[*]}" )

Die Verwendung von in *anstelle von @in "${words[*]}"erzeugt aus der Verkettung aller Elemente des Arrays einen einzelnen String words. Die Elemente werden durch das erste Zeichen von abgegrenzt $IFS, weshalb wir dies vor der Erweiterung auf ein Komma setzen.

Ich habe es IFSin einer Subshell festgelegt, um zu vermeiden, dass es versehentlich für eine andere Operation festgelegt wird als für die einzelne Erweiterung, die zum Erstellen der durch Kommas getrennten Zeichenfolge für den printfAufruf erforderlich ist.

Anstatt eine Subshell zum IFSlokalen Festlegen zu verwenden, können Sie es auch festlegen und dann zurücksetzen:

words=(a b c)

IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}

Dadurch wird zunächst ein Komma als erstes Zeichen hinzugefügt $IFS, wobei der alte Wert der Variablen als Zeichen nach dem Komma erhalten bleibt.

Die Parameterersetzung ${IFS#?}würde das erste Zeichen löschen (das Komma, das wir hinzugefügt haben).

verwandte Informationen