Setzen Sie IFS auf Newline, wie folgt:
IFS='
'
for x in `ls -l $1`; do echo $x; done
Setzen Sie eine Sub-Shell darum, wenn Sie IFS nicht dauerhaft einstellen möchten:
(IFS='
'
for x in `ls -l $1`; do echo $x; done)
Oder verwenden Sie while | lesen Sie stattdessen:
ls -l $1 | while read x; do echo $x; done
Eine weitere Option, die while/read auf derselben Shell-Ebene ausführt:
while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
Wie bereits erwähnt, ist awk dafür das richtige Werkzeug. Wenn Sie awk nicht verwenden möchten, können Sie, anstatt die Ausgabe von "ls -l" Zeile für Zeile zu parsen, über alle Dateien iterieren und ein "ls -l" für jede einzelne Datei wie folgt ausführen:
for x in * ; do echo `ls -ld $x` ; done
Es hängt davon ab, was Sie mit jeder Zeile tun möchten. awk ist ein nützliches Dienstprogramm für diese Art der Verarbeitung. Beispiel:
ls -l | awk '{print $9, $5}'
.. auf meinem System gibt den Namen und die Größe jedes Eintrags im Verzeichnis aus.