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 .

10voto

user31986 Punkte 1380

x=${arr[*]// /,}

Dies ist der kürzeste Weg.

Beispiel,

# ZSH:
arr=(1 "2 3" 4 5)
x=${"${arr[*]}"// /,}
echo $x  # output: 1,2,3,4,5

# ZSH/BASH:
arr=(1 "2 3" 4 5)
a=${arr[*]}
x=${a// /,}
echo $x  # output: 1,2,3,4,5

8voto

guest Punkte 51

Danke @gniourf_gniourf für die ausführlichen Kommentare zu meiner bisherigen Kombination der besten Welten. Tut mir leid, dass ich den Code nicht gründlich entworfen und getestet habe. Hier ist ein besserer Versuch.

# join with separator
join_ws() { local d=$1 s=$2; shift 2 && printf %s "$s${@/#/$d}"; }

Diese Schönheit ist von der Konzeption her

  • (noch) 100% reine Bash (danke für den expliziten Hinweis, dass printf auch ein builtin ist. Ich war mir dessen vorher nicht bewusst ... )
  • arbeitet mit mehrstelligen Begrenzungszeichen
  • kompakter und vollständiger und dieses Mal sorgfältig durchdacht und langjährig getestet mit zufälligen Teilstrings aus Shell-Skripten unter anderem, die Verwendung von Shell-Sonderzeichen oder Steuerzeichen oder keine Zeichen in Trennzeichen und / oder Parametern, und Randfälle, und Eckfälle und andere Spitzfindigkeiten wie überhaupt keine Argumente. Das garantiert nicht, dass es keinen weiteren Fehler gibt, aber es wird eine etwas schwierigere Herausforderung sein, einen zu finden. BTW, sogar die derzeit am häufigsten gewählten Antworten und verwandte leiden unter solchen Dingen wie dem -e Bug ...

Weitere Beispiele:

$ join_ws '' a b c
abc
$ join_ws ':' {1,7}{A..C}
1A:1B:1C:7A:7B:7C
$ join_ws -e -e
-e
$ join_ws $'\033[F' $'\n\n\n'  1.  2.  3.  $'\n\n\n\n'
3.
2.
1.
$ join_ws $ 
$

7voto

Riccardo Galli Punkte 11416

Printf-Lösung, die Trennzeichen beliebiger Länge akzeptiert (basierend auf der Antwort @doesn't matters)

#/!bin/bash
foo=('foo bar' 'foo baz' 'bar baz')

sep=',' # can be of any length
bar=$(printf "${sep}%s" "${foo[@]}")
bar=${bar:${#sep}}

echo $bar

7voto

eel ghEEz Punkte 1113
s=$(IFS=, eval 'echo "${FOO[*]}"')

7voto

Camilo Martin Punkte 35643

Kürzere Version der ersten Antwort:

joinStrings() { local a=("${@:3}"); printf "%s" "$2${a[@]/#/$1}"; }

Verwendung:

joinStrings "$myDelimiter" "${myArray[@]}"

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