PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: Dateinamen mit Leerzeichen als Parameter



ddamjan
04.09.05, 12:31
Hi!

Wie kann ich ein Script dazu bringen das es mir einen Dateinamen mit Leerzeichen als einen Parameter ansieht?

Folgendes Testscript mit Namen "ScriptDateiname.sh" soll einfach alle ihm übergebenen Parameter ausgeben:

#!/bin/sh

for param in $*;do
echo "$param"
done

So schauen meine Dateien aus:

darko@base:~/test$ ll
insgesamt 4,0K
-rw-r--r-- 1 darko darko 0 2005-09-04 12:28 Datei mit Leerzeichen.txt
-rw-r--r-- 1 darko darko 0 2005-09-04 12:30 DateiohneLeerzeichen.txt
-rwxr-xr-x 1 darko darko 49 2005-09-04 12:27 ScriptDateiname.sh
darko@base:~/test$

Wenn ich nun die Datei ohne Leerzeichen angebe dann funktioniert es:

darko@base:~/test$ ./ScriptDateiname.sh DateiohneLeerzeichen.txt
DateiohneLeerzeichen.txt
darko@base:~/test$

Die Datei mit Leerzeichen wird aber als drei verschiedene Parameter interpretiert:

darko@base:~/test$ ./ScriptDateiname.sh Datei\ mit\ Leerzeichen.txt
Datei
mit
Leerzeichen.txt
darko@base:~/test$

Auch wenn ich den Dateinamen in doppelte Anführungszeichen setze:

darko@base:~/test$ ./ScriptDateiname.sh "Datei\ mit\ Leerzeichen.txt"
Datei\
mit\
Leerzeichen.txt
darko@base:~/test$ ./ScriptDateiname.sh "Datei mit Leerzeichen.txt"
Datei
mit
Leerzeichen.txt
darko@base:~/test$


Und genauso in einfache Anführungszeichen:

darko@base:~/test$ ./ScriptDateiname.sh 'Datei\ mit\ Leerzeichen.txt'
Datei\
mit\
Leerzeichen.txt
darko@base:~/test$ ./ScriptDateiname.sh 'Datei mit Leerzeichen.txt'
Datei
mit
Leerzeichen.txt
darko@base:~/test$

Weiß einer von euch wie das geht?
Ach ja, und schlussendlich will ich dann dem Script auch mehrere Dateinamen als Parameter übergeben können.

MfG
Darko

nordi
04.09.05, 13:44
Deine for-Schleife muss anfangen mit:

for param in "$*"; do

Beachte die "" um das $*. Für mehrere Dateien machst du

programmname "datei a" "datei b" "datei c"


Edit: 10,0 Punkte für am besten gestellte Frage seit langem :)

ddamjan
04.09.05, 14:22
Deine for-Schleife muss anfangen mit:

for param in "$*"; do

Beachte die "" um das $*. Für mehrere Dateien machst du

programmname "datei a" "datei b" "datei c"


Edit: 10,0 Punkte für am besten gestellte Frage seit langem :)Danke, ich geb mir Mühe. :)

Jedoch... so geht es auch nicht... ich habe nun "$*" geschrieben und das Ergebniss schaut so aus das nun alle Parameter als ein Parameter angesehen werden, also genau das andere Extrem:

darko@base:~/test$ ./ScriptDateiname.sh "Datei mit Leerzeichen1.txt" "Datei mit Leerzeichen2.txt"
Datei mit Leerzeichen1.txt Datei mit Leerzeichen2.txt
darko@base:~/test$ ./ScriptDateiname.sh 'Datei mit Leerzeichen1.txt' 'Datei mit Leerzeichen2.txt'
Datei mit Leerzeichen1.txt Datei mit Leerzeichen2.txt
darko@base:~/test$Aber gut, wieder was gelernt, hehe.

Nachtrag:
Ich hab nun die Lösung!
Es funktioniert mit "$@"!
Also so funktioniert es nun:

#!/bin/sh

for param in "$@";do
echo "$param"
doneTrotzdem danke für die Hilfe! :)

MfG
Darko

ddamjan
04.09.05, 18:00
Hier (http://www.linuxforen.de/forums/showthread.php?t=193992), damit man sieht wozu ich das gebraucht habe. :)

gnuroman
04.09.05, 18:28
Man kann auch einfach am Anfang des scripts die Variable IFS setzen:


IFS="
"


Also in deinem Beispiel



#!/bin/sh
IFS="
"
for param in $*;do
echo "$param"
done


Weitere Infos (http://www.faqs.org/docs/bashman/bashref_33.html)

Besonders dann nützlich, wenn man im weiteren script Dateien mit Leerzeichen verarbeitet, an die man nicht über die Parameter herankommt.