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 .

1voto

Dexin Wang Punkte 447

Falls die zu verbindenden Elemente kein Array, sondern eine durch Leerzeichen getrennte Zeichenkette sind, können Sie etwas wie folgt tun:

foo="aa bb cc dd"
bar=`for i in $foo; do printf ",'%s'" $i; done`
bar=${bar:1}
echo $bar
    'aa','bb','cc','dd'

Mein Anwendungsfall ist zum Beispiel, dass einige Zeichenketten in meinem Shell-Skript übergeben werden und ich muss diese verwenden, um eine SQL-Abfrage auszuführen:

./my_script "aa bb cc dd"

In my_script muss ich "SELECT * FROM table WHERE name IN ('aa','bb','cc','dd')" eingeben. Dann wird der obige Befehl nützlich sein.

1voto

David Wolever Punkte 138377

Im Moment benutze ich:

TO_IGNORE=(
    E201 # Whitespace after '('
    E301 # Expected N blank lines, found M
    E303 # Too many blank lines (pep8 gets confused by comments)
)
ARGS="--ignore `echo ${TO_IGNORE[@]} | tr ' ' ','`"

Was funktioniert, aber (im allgemeinen Fall) wird schrecklich brechen, wenn Array-Elemente ein Leerzeichen in ihnen haben.

(Für diejenigen, die es interessiert, ist dies ein Wrapper-Skript um pep8.py )

0voto

Jordan Punkte 156

Vielleicht übersehe ich etwas Offensichtliches, da ich ein Neuling in der ganzen bash/zsh-Sache bin, aber es sieht für mich so aus, als ob Sie nicht die Option printf überhaupt nicht. Und es wird auch nicht wirklich hässlich, darauf zu verzichten.

join() {
  separator=$1
  arr=$*
  arr=${arr:2} # throw away separator and following space
  arr=${arr// /$separator}
}

Zumindest hat es bei mir bisher ohne Probleme funktioniert.

Zum Beispiel, join \| *.sh die, sagen wir mal, ich bin in meinem ~ Verzeichnis, Ausgaben utilities.sh|play.sh|foobar.sh . Das ist gut genug für mich.

EDIT: Dies ist im Grunde Antwort von Nil Geisweiller aber verallgemeinert zu einer Funktion.

0voto

user541686 Punkte 196656

Hier ist eine, die von den meisten POSIX-kompatiblen Shells unterstützt wird:

join_by() {
    # Usage:  join_by "||" a b c d
    local arg arr=() sep="$1"
    shift
    for arg in "$@"; do
        if [ 0 -lt "${#arr[@]}" ]; then
            arr+=("${sep}")
        fi
        arr+=("${arg}") || break
    done
    printf "%s" "${arr[@]}"
}

0voto

dengel Punkte 305

Dieser Ansatz berücksichtigt die Leerzeichen innerhalb der Werte, erfordert aber eine Schleife:

#!/bin/bash

FOO=( a b c )
BAR=""

for index in ${!FOO[*]}
do
    BAR="$BAR,${FOO[$index]}"
done
echo ${BAR:1}

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