2013-03-28 13 views
118

Wie drucke ich das Array-Element eines Bash-Array auf separaten Zeilen? Dieser funktioniert, aber sicher gibt es eine bessere Art und Weise:Bash Print Array-Elemente in separaten Zeilen

$ my_array=(one two three) 
$ for i in ${my_array[@]}; do echo $i; done 
one 
two 
three 

dieses versucht, aber es hat nicht funktioniert:

$ IFS=$'\n' echo ${my_array[*]} 
one two three 

Antwort

243

versuchen dies zu tun:

$ printf '%s\n' "${my_array[@]}" 

Der Unterschied zwischen [email protected] und $*:

  • Nicht angegeben, die Ergebnisse sind nicht spezifiziert. In Bash erweitern beide zu separaten Argumenten und dann Wordsplit und globbed.

  • Zitiert erweitert "[email protected]" jedes Element als separates Argument, während "$*" erweitert sich auf die args in ein Argument verschmolzen: "$1c$2c..." (wobei c ist das erste Zeichen von IFS).

Sie wollen fast immer "[email protected]". Gleiches gilt für "${arr[@]}".

Zitieren Sie sie immer!

+4

Und Notiz, die doppelten Anführungszeichen um die Variablenreferenz sind wichtig, wenn Sie sicherstellen möchten, dass Elemente mit internen Leerzeichen nicht versehentlich getrennt werden. – danfuzz

+1

@sputnick: funktioniert nicht, die Array-Elemente enden auf einer einzigen Zeile –

+0

Sind Sie sicher, dass Sie '[@]' und nicht '[*]'? Es macht einen Unterschied. – danfuzz

48

zitieren Sie einfach das Argument an echo:

(IFS=$'\n'; echo "${my_array[*]}") 

die Unterschale hilft, die IFS nach Gebrauch wieder herstellt

+3

sorry perreal, ich habe mein Häkchen auf sputnick gesetzt, obwohl ich deine Lösung besser fand, nur weil ich von der Funktion 'printf' erfuhr. –

+2

Danke für diese Antwort - Ich mag es! Nach der Erweiterung treten zu schlechte Zuweisungen auf, so dass 'IFS = $ '\ n' echo" $ {my_array [*]} "' nicht funktioniert. Naja! – cxw

3

ich die Antworten hier in einem riesigen versucht, ... wenn Schleife, aber didn‘ t erhalten jede Freude - so habe ich es so, vielleicht chaotisch, aber hat seinen Zweck erfüllt:

# EXP_LIST2 is iterated  
# imagine a for loop 
    EXP_LIST="List item"  
    EXP_LIST2="$EXP_LIST2 \n $EXP_LIST" 
done 
echo -e $EXP_LIST2 

obwohl das ein Leerzeichen in die Liste aufgenommen, was in Ordnung ist - ich wollte es ein wenig eingezogen. Nehmen Sie auch an, dass "\ n" in der ursprünglichen $ EP_LIST gedruckt werden könnte.

+1

Sieht nicht wie ein vollständiges Beispiel aus. – kenorb

22

Mit für:

for each in "${alpha[@]}" 
do 
    echo "$each" 
done 

Mit Geschichte; Hinweis: Dies wird fehlschlagen, wenn Ihre Werte ! enthalten:

history -p "${alpha[@]}" 

Mit Basisnamen; Hinweis: Dies wird fehlschlagen, wenn Ihre Werte / enthalten:

basename -a "${alpha[@]}" 

Mit shuf; beachten Sie, dass die Ergebnisse nicht in Ordnung kommen könnten:

shuf -e "${alpha[@]}" 
+5

"shuf" ... "kommt vielleicht nicht in Ordnung" ... urkomisch. – Walf

1

Eine weitere nützliche Variante Rohr tr ist:

echo ${my_array[@]} | tr " " "\n"

Das sieht einfach und kompakt

+3

Außer dies bricht auf 'my_array = (" eins zwei "drei)' –

Verwandte Themen