PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: Schon wieder die Leerzeichen



celindir
23-05-2007, 18:57
Hallo zusammen,

ich hatte ja gedacht, ich hätte es begriffen, mit den Leerzeichen in Pfad-oder Dateiangaben aber nun stehe ich doch wieder vor einem Problem:


for mp3 in "$inputdir"*.mp3;
do
echo testit
echo $(`echo mp3info -p "%t" $mp3`)
echo testit end
done
führt bei
inputdir=/home/celindir/testordner/mp 3/
und 01_000.00 000.30.mp3 im Verzeichnis zu

Error opening MP3: /home/celindir/testordner/mp: No such file or directory
Error opening MP3: 3/01_000.00: No such file or directory
Error opening MP3: 000.30.mp3: No such file or directory


Was kann ich machen, damit es auch mit Leerzeichen im eingeschlossenen Aufruf klappt?

Vielen Dank fürs Kopfzerbrechen

xstevex22
23-05-2007, 19:50
Hi,



IFS="
"
for mp3 in "$inputdir"*.mp3;
do
echo testit
echo $(`echo mp3info -p "%t" "$mp3"`)
echo testit end
done

celindir
23-05-2007, 20:08
Hi xstevex22,

Hab's versucht.

Nun erhalte ich folgende Fehlermeldung

mp3info -p %t /home/celindir/testordner/mp 3/01_000.00 000.30.mp3:
No such file or directory

Leider nicht der gewünschte Erfolg.

Weiß leider nicht woran es liegt.

403
25-05-2007, 15:48
so funktionierts bei mir:


for mp3 in "$inputdir"*.mp3; do mp3info -p "%t" "$mp3"; done

celindir
28-05-2007, 14:38
so funktionierts bei mir:


for mp3 in "$inputdir"*.mp3; do mp3info -p "%t" "$mp3"; done


Stimmt, so funktionierts, das war aber leider nicht das Problem.

Mein Problem ist, wie ich die Ausgabe wiederum in eine Variable schreiben kann.
Also

mp3titel=$(`echo mp3info -p "%t" "$mp3"`)
echo $mp3titel

und dabei hakt es leider immer noch:confused:

403
28-05-2007, 15:54
Also die Ausgabe _alles_ in eine Variable? Das hat meiner Meinung nach keinen Sinn.
Du kannst aber die Ausgabe in eine Datei schreiben und diese dann ausgeben, weiterbearbeiten...

Wenn du natuerlich immer nur den aktuellen Titel angezeigt bekommen willst, ist das was
anderes, das geht fuer mich aber bisher nicht klar aus deinen Aussagen hervor.

Naja du schaffst das schon ;)

Gruss 403

jan61
28-05-2007, 21:19
...
Mein Problem ist, wie ich die Ausgabe wiederum in eine Variable schreiben kann.
Also

mp3titel=$(`echo mp3info -p "%t" "$mp3"`)
echo $mp3titel

und dabei hakt es leider immer noch:confused:

Zuerst mal meine persönliche Meinung: Vergiss den for, wenn Du solche Schleifen baust. Nimm read, damit ersparst Du Dir auch, immer auf IFS, OFS & Co. aufpassen zu müssen.

ls "$inputdir"/*.mp3 | while read mp3; do
do_something
done
Die for-Schleife ist nur in ganz wenigen Fällen nötig, z. B. wenn Du innerhalb der Schleife noch per read auf stdin zugreifen willst oder wenn Du in der Schleife eine Variable belegst, die danach sichtbar sein soll (alles nach der Pipe läuft in einer Subshell ab).

Zu Deiner Variablenzuweisung: Das ist doppelt (ähm - sogar 3x;-) gemoppelt.


# bash-spezifisch
mp3titel=$(mp3info -p "%t" "$mp3")
# für sh/ksh/bash gueltig
mp3titel="`mp3info -p \"%t\" \"$mp3\"`"
# auch im echo immer quoten, sonst wird z. B. aus 2 Blanks einer
echo "$mp3titel"

Zur Erklärung:
in der bash hat die Konstruktion $(Befehl) die gleiche Funktion wie allgemein `Befehl` - damit wird die Standardausgabe von Befehl zurückgegeben. Der echo gibt einfach nur die nachfolgenden Zeichen auf stdout aus - würde Dir also das mp3info-Kommando als solches zurückgeben.

Jan

celindir
29-05-2007, 08:17
@jan61

Wow, da lag ich wohl ziemlich daneben.

Das kommt davon, wenn man bash-Programmierung hauptsächlich mit Try and Error macht, dann kommen oft Sachen raus, die zwar funktionieren, aber keiner weiß warum.

Wenn das klappt, dann hab ich echt mal etwas Sinnvolles dazu gelernt.

Werde es heute Abend gleich ausprobieren.

Auf jeden Fall schon mal vielen Dank für die Erläuterung und den Tipp mit der while-Schleife.

Gruß


Nachtrag: Hat super geklappt! Herzlichen Dank, auch für die gute Erläuterung!