2013-03-28 7 views
118

Come si stampa l'elemento dell'array di un array Bash su linee separate? Questo funziona, ma sicuramente c'è un modo migliore:bash stampa gli elementi dell'array su linee separate

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

provato questo, ma non ha funzionato:

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

risposta

243

Prova a fare questo:

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

La differenza tra [email protected] e $*:

  • Non quotato, i risultati non sono specificati. In Bash, entrambi si espandono per separare gli argomenti e quindi wordsplit e globbed.

  • Citato, "[email protected]" espande ciascun elemento come argomento separato, mentre "$*" espande alle args fuse in un argomento: "$1c$2c..." (dove c è primo carattere della IFS).

Quasi sempre si desidera "[email protected]". Lo stesso vale per "${arr[@]}".

Citale sempre!

+4

E nota, le virgolette semplici e compatti in tutto il i riferimenti variabili sono importanti se si desidera assicurarsi che gli elementi con spazi interni non vengano inavvertitamente divisi. – danfuzz

+1

@sputnick: non funziona, gli elementi dell'array finiscono su una singola riga –

+0

Sei sicuro di aver usato '[@]' e non '[*]'? Fa la differenza. – danfuzz

48

Basta citare l'argomento a risuonare:

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

guscio sub aiuta a ripristinare le IFS dopo l'uso

+3

scusate perverso, ho spostato il segno di spunta su Sputnick, nonostante gradissi la tua soluzione meglio, solo perché ho saputo della funzione 'printf'. –

+2

Grazie per questa risposta - Mi piace! I compiti troppo brutti si verificano dopo l'espansione, quindi "IFS = $ '\ n' echo" $ {my_array [*]} "' non funziona. Oh bene! – cxw

3

ho cercato le risposte qui in un gigante per ... se ciclo, ma didn' t ottenere alcuna gioia - così ho fatto in questo modo, forse disordinato, ma ha fatto il lavoro:

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

anche se che ha aggiunto uno spazio per la lista, che va bene - ho voluto che rientrato un po '. Supponiamo anche che "\ n" possa essere stampato nell'EP_LIST $ originale.

+1

Non sembra un esempio completo. – kenorb

22

Utilizzando per:

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

Utilizzando storia; notare che questo fallirà se i valori contengono !:

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

Utilizzando basename; notare che questo fallirà se i valori contengono /:

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

Utilizzando shuf; notare che i risultati potrebbero non uscire in ordine:

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

"shuf" ... "potrebbe non venire fuori in ordine" ... esilarante. – Walf

1

Un'altra variante utile è tubo per tr:

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

Questo sembra

+3

Tranne che questa interruzione su 'my_array = (" one two "tre)' –

Problemi correlati