PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: for-loop: wie kann ich dateien mit leerzeichen bearbeiten?



DirtyDoc
17.11.06, 19:16
hi, ich hoffe, dass das hier ein weiser mensch liest, der willig ist mir mal ganz kurz zu erklären, was ich in diesem zusammenhang falsch verstehe...

ich habe ein kleines programm, was nichts anderes macht, als zwei strings auszugeben, davon einen mit nem escapten space:

seb@laptop ~ $ ./test.sh
hallo
auf\ wiedersehen
seb@laptop ~ $
wenn ich diesen output nun an ne for-loop gebe, passiert folgendes:

seb@laptop ~ $ for i in `./test.sh`; do echo $i; done
hallo
auf\
wiedersehen
seb@laptop ~ $
dass for im allgemeinen mit escapten strings umgehen kann zeigt folgendes beispiel:

seb@laptop ~ $ for i in hallo auf\ wiedersehen; do echo $i; done
hallo
auf wiedersehen
seb@laptop ~ $
anscheinend versteht die for loop den escapten string nicht richtig, wenn man den output in eine variable leitet, sondern interpretiert statt dessen das backslash als zeilenumbruch.

kann mir hier irgendwer nen heissen tipp geben, wie ich sowas geschickt lösen kann? gibt es für for auch so nen schalter wie bei read -r , der bewirkt, dass for die backslashes als teil des strings ansieht?

zyrusthc
17.11.06, 19:31
Arbeite doch mal mit "" ;)

Greeez Oli

sepp2k
17.11.06, 19:36
anscheinend versteht die for loop den escapten string nicht richtig, wenn man den output in eine variable leitet, sondern interpretiert statt dessen das backslash als zeilenumbruch.
Nein, er interpretiert das als Backslash gefolgt von einem Leerzeichen (an statt als escapetes Leerzeichen). Lösung deines Problems ist, wie mein Vorposter schon andeutete, den Backslash gleich wegzulassen und statt dessen $i in Anführungszeichen zu setzen.

DirtyDoc
18.11.06, 00:59
seb@laptop ~ $ ./test.sh
"hallo"
"auf wiedersehen"
seb@laptop ~ $ for i in `./test.sh`; do echo $i; done
"hallo"
"auf
wiedersehen"
seb@laptop ~ $ for i in "hallo" "auf wiedersehen"; do echo $i; done
hallo
auf wiedersehen
seb@laptop ~ $
sonst noch konstruktive vorschläge? ^^

DirtyDoc
18.11.06, 01:04
ok, zu voreilig gewesen...

seb@laptop ~ $ ./test.sh
hallo
auf wiedersehen
seb@laptop ~ $ for i in "`./test.sh`"; do echo "$i"; done
hallo
auf wiedersehen
seb@laptop ~ $
allerdings hilft es nur wenn ich sowohl "vorne" bei dem command, als auch das $i in hochkommas setze... wenn nur eins davon gesetzt ist, geht es nicht

danke euch für die hilfe..!!

hp_tux
18.11.06, 14:07
Hallo,


allerdings hilft es nur wenn ich sowohl "vorne" bei dem command, als auch das $i in hochkommas setze... wenn nur eins davon gesetzt ist, geht es nicht
nun. es funktioniert auch ohne Anführungsstriche, wenn man statt $i einfach ${i} verwendet. Diese Schreibweise vermeidet auch immer dann Probleme, wenn ${i} Teil eines Strings ist, z.B. in sowas wie "${i}.bak".

Gruß

hp_tux