Establezca IFS en nueva línea, así:
IFS='
'
for x in `ls -l $1`; do echo $x; done
Coloque una subcapa a su alrededor si no desea configurar IFS de forma permanente:
(IFS='
'
for x in `ls -l $1`; do echo $x; done)
O use while | leer en su lugar:
ls -l $1 | while read x; do echo $x; done
Una opción más, que ejecuta while/read en el mismo nivel de shell:
while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
Como ya se mencionó, awk es la herramienta adecuada para esto. Si no quiere usar awk, en lugar de analizar la salida de "ls -l" línea por línea, puede iterar sobre todos los archivos y hacer un "ls -l" para cada archivo individual como este:
for x in * ; do echo `ls -ld $x` ; done
Depende de lo que quieras hacer con cada línea. awk es una utilidad útil para este tipo de procesamiento. Ejemplo:
ls -l | awk '{print $9, $5}'
.. en mi sistema imprime el nombre y el tamaño de cada elemento en el directorio.