PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: Zusammenfassen von Wörten in for-Schleifen



mike el angelo
11-07-2007, 16:07
Hallo,

Ich habe gerade ein, vielleicht etwas merkwürdig anmutendes, Problem. Ich habe schon Probleme damit, es überhaupt verständlich zu fomulieren...

Wenn man in der Bash folgendes eingibt:

E=*
for I in ${E}; do
echo ${I}
done
dann werden sämtliche Dateien im aktuellen Verzeichnis untereinander geschrieben. Auch Dateien, die ein oder mehrere Leerzeichen enthalten, werden nur in einer Zeile ausgegeben. Schreibt man aber etwas in der Art:

E='"eins zwei" "drei vier"'
for I [...]
dann sieht die Ausgabe (logischerweise) so aus:

"eins
zwei"
"drei
vier"

Wie muss ich E deklarieren, um als Ausgabe

eins zwei
drei vier
zu erhalten?

peschmae
11-07-2007, 19:01
Das was dir vermutlich nicht bewusst ist (und mir zugegebenermassen auch eben erst aufgefallen ist):


E=*
weist den literalen Wert * zu. Das * wird erst zur "Laufzeit" interpretiert. Illustration (/tmp/a enthält die Dateien a, b, c und d; /tmp/b die Datei dassternchen...):


peschmae@sid:/tmp/a$ E=*
peschmae@sid:/tmp/a$ echo $E
a b c d
peschmae@sid:/tmp/a$ for I in ${E}; do
> echo ${I}
> done
a
b
c
d
peschmae@sid:/tmp/a$ cd ..
peschmae@sid:/tmp$ cd b
peschmae@sid:/tmp/b$ echo $E
dassternchenistvariabel
peschmae@sid:/tmp/b$ for I in ${E}; do
> echo ${I}
> done
dassternchenistvariabel
peschmae@sid:/tmp/b$


MfG Peschmä

peschmae
11-07-2007, 19:11
Habe deine Frage aber noch nicht wirklich beantwortet. Ich glaube nicht dass das einfach so geht - kann mich aber auch täuschen, die Bash hat viele Geheimnisse :D

Zu studieren: http://www.tldp.org

Lösungsansätze:
1) Array


peschmae@sid:~$ E[0]="eins zwei"
peschmae@sid:~$ E[1]="drei vier"
peschmae@sid:~$ E[2]="fünf"
peschmae@sid:~$ for ((i = 0; i < ${#E }; i++)); do echo ${E[i]}; done
eins zwei
drei vier
fünf
peschmae@sid:~$


2) echo -e


peschmae@sid:~$ E="eins zwei\ndrei vier"
peschmae@sid:~$ echo -e $E
eins zwei
drei vier
peschmae@sid:~$

dem Anhängen kannst du noch ein:


peschmae@sid:~$ IFS="
> "
peschmae@sid:~$ for f in $(echo -e $E); do echo $f; done
eins zwei
drei vier
peschmae@sid:~$


Was hier passiert: Das "echo -e" interpretiert dir die \n-Sequenzen und ersetzt sie durch Zeilenumbrüche (im Normalfall - d.h. z.B. in C kannst du \n schreiben wenn du "Zeilenumbruch" meinst).
IFS so setzen (das ist der "inter field separator" oder so ;))


IFS="
"

mit einem Zeilenumbruch zwischen " und "

MfG Peschmä

P.S. Willkommen hier im Forum.

mike el angelo
11-07-2007, 19:33
Die Sache mit den Arrays kommt leider nicht in Frage, weil ich diese "Zeile" schon einem Array zuweisen will. Der zweite Ansatz allerdings, klingt gut und ist einer Überlegung durchaus Wert. :)

Danke für Deine Hilfe.
Wolfgang (alias Mike...)

P.S. Hallo :)