Imposta IFS su newline, in questo modo:
IFS='
'
for x in `ls -l $1`; do echo $x; done
Metti una sotto-shell se non vuoi impostare IFS in modo permanente:
(IFS='
'
for x in `ls -l $1`; do echo $x; done)
Oppure usa while | leggi invece:
ls -l $1 | while read x; do echo $x; done
Un'altra opzione, che esegue while/read allo stesso livello di shell:
while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
Come già accennato, awk è lo strumento giusto per questo. Se non vuoi usare awk, invece di analizzare l'output di "ls -l" riga per riga, puoi iterare su tutti i file e fare un "ls -l" per ogni singolo file in questo modo:
for x in * ; do echo `ls -ld $x` ; done
Dipende da cosa vuoi fare con ogni riga. awk è un'utilità utile per questo tipo di elaborazione. Esempio:
ls -l | awk '{print $9, $5}'
.. sul mio sistema stampa il nome e la dimensione di ogni elemento nella directory.