2012-10-29 18 views

risposta

48

Si può scrivere:

while IFS= read -r line 
do 
    echo "$line" 
done <<< "$the_list" 

Vedi §3.6.7 "Here Strings" in the Bash Reference Manual.

(ho anche preso la libertà di aggiungere alcuni doppi apici, e l'aggiunta di -r e IFS=-read, per evitare troppa gingillarsi con il contenuto delle variabili.)

+2

Does 'IFS =' imposta l'IFS al carattere nullo? Perché ne hai bisogno in questo caso? – doubleDown

+6

@doubleDown: 'IFS =' imposta '$ IFS' sulla stringa vuota (quindi non contiene alcun carattere). In questo caso, poiché esiste un solo campo, il suo unico effetto è impedire la rimozione dei principali caratteri IFS dall'inizio della riga. (Per vedere cosa intendo, confronta 'read foo <<< 'bar'; echo" $ foo "' con 'IFS = read foo <<< 'bar'; echo" $ foo "'.) – ruakh

15

Si può semplicemente utilizzare

your_code | while read line; 
do 
    echo $line 
done 

se non ti dispiace il ciclo durante l'esecuzione in una subshell (tutte le variabili modificate non saranno visibili nel genitore dopo lo done).

+0

eccellente! molte grazie! –

22

Se non si utilizza la variabile per qualsiasi altra cosa, puoi anche farne a meno:

while read line ; do 
    echo $line 
done < <(... code ...) 
-1

Il file di script deve essere in modalità Linux. Precedentemente era in modalità dos. L'ho cambiato usando dos2unix filename.

es .:

dos2unix sshcopy.sh 

Ora funziona per me.

+0

La risposta proposta da [ruakh] (http://stackoverflow.com/a/13122491/622391) è stato accettato dal richiedente. Ciò significa che il problema era _non_ correlato al formato file dello script. –

Problemi correlati