Datei zeilenweise einlesen und strings ausgeben

Delacroix

Cadet 4th Year
Registriert
Mai 2012
Beiträge
71
Hallo Leute,
ich bin jetzt nicht so vertraut mit Linux und der Shellprogrammierung.

Vielleicht könnt ihr mir weiterhelfen... ?

Ich habe eine Textdatei in der eine Liste mit Dateinamen ist (aber ohne endungen).
Nun will ich diese Datei einlesen und das ganze in der shell ausgeben. Es soll aber vor und nach dem dateinamen noch extra string dazu kommen.

Folgender Code:

PHP:
while read line; 
do 
	echo "/media/" . $line "/" . $line . "\.iso" ;
done < liste.txt

aber was ich ausgegeben bekomme sieht folgendermaßen aus:

Code:
 . \.isoDateiname

ich kapier nich wieso?
Er verschluckt das "/media/" und stellt \.iso voran und schreibt direkt dahinter den inhalt aus der textdatei.


Hoffe mir kann jemand weiterhelfen ;-)
 
Code:
#!/bin/bash

while read line; do
        echo "/media/$line/$line.iso"
done < $1

P.S.: $1 ist der erste Parameter, den du bei Aufruf des Scripts angibst. Kannst du auch hart da reinschreiben, wie in deinem Beispiel.
 
Zuletzt bearbeitet:
Delacroix schrieb:
wenn ich die zeile verwende dann gibts syntaxerror
ähm, welches System hat denn eine Shell aber kein awk im Path? Das funktioniert sogar auf meinem Mac, auf jedem normalen Linux sowieso...
 
@tumbleweed:
dein codeschnipsel ist leider genau meine ausgangssituation gewesen... da kommt der mist raus, dass er mir die vordere zeichenkette komplett verschluckt und ".iso" dann an den anfang des strings setzt (die ersten in der variable $line überschreibt ).

@mickey mouse:
vielleicht check ich ja nur nicht so ganz wie man den verwendet, aber wenn ich den so kopier wie du es gepostet hast, dann funzt es jedenfalls nicht...

bzw. wenn ich es 1:1 kopiere, dann heißt es "unterminated quoted string"

ps: das system ist ein ubuntu server 13.04
 
Zuletzt bearbeitet:
Dann machst du grundlegend etwas falsch bzw. führst nicht meinen Code aus.
Code:
tumble@milkshake-linux:~/scripts$ cat fileToPrint.txt 
a
b
c
d
e
f
g
tumble@milkshake-linux:~/scripts$ ./filePrinter.sh fileToPrint.txt 
/media/a/a.iso
/media/b/b.iso
/media/c/c.iso
/media/d/d.iso
/media/e/e.iso
/media/f/f.iso
/media/g/g.iso
tumble@milkshake-linux:~/scripts$ cat filePrinter.sh 
#!/bin/bash

while read line; do
    echo "/media/$line/$line.iso"
done < $1
Der output kommt von einem Xubuntu 13.04 (64 bit) mit GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu).

Vielleicht habe ich deine Ausgangslage auch falsch verstanden und deine "fileToPrint.txt" enthält etwas anderes.
 
Zuletzt bearbeitet:
hier mal der output wenn ich genau das gleiche tue wie du Tumbleweed:

Code:
Delacroix@UBUNTU-SERVER:~$ cat /media/FILME/DVD/liste.txt 

Traumschiff Surprise - Periode 1
New York Für Anfänger

Delacroix@UBUNTU-SERVER:~$ cat dvd-zu-mkv.sh

#!/bin/bash

while read datei; do
	echo "/media/$datei/$datei.iso"
done < $1

Delacroix@UBUNTU-SERVER:~$ ./dvd-zu-mkv.sh /media/FILME/DVD/liste.txt

/media//.iso
/media//.iso

wo mein grundsätzliches problem liegt, würd ich auch gerne wissen *haarerauf*

eigentlich müsste es ja funktionieren...

die ausgangssituation war:

Code:
Delacroix@UBUNTU-SERVER:~$ cat dvd-zu-mkv2.sh 

#!/bin/bash

while read pfad
do
      echo "/media/FILME/DVD/$pfad/$pfad.iso"
done < /media/FILME/DVD/liste.txt

Delacroix@UBUNTU-SERVER:~$ sh dvd-zu-mkv2.sh 

.isoumschiff Surprise - Periode 1rise - Periode 1
.iso York Für Anfängerork Für Anfänger
 
Kann ich mir nur mit seltsamen unsichtbaren characters in der Datei erklären, also sowas wie line breaks, carriage returns usw. Wurde die Datei von einem Windows/Mac geschrieben?

Habe deine Datei mal nachgebaut und output ist
/media//.iso
/media/Traumschiff Surprise - Periode 1/Traumschiff Surprise - Periode 1.iso
/media/New York Für Anfänger/New York Für Anfänger.iso
/media//.iso
Für die Leerzeilen müsste man entsprechend skippen, aber das erklärt noch nicht, warum die anderen Zeilen bei dir nicht funktionieren. Bau mal mit vim oder nano eine ähnliche Datei und probiere es aus.
 
hab ich grade ne neue datei gemacht mit dem inhalt "eins zwei drei vier" (mit nano)

resultat je nach "version" des scripts

.isosa/FILME/DVD/eins
.isoia/FILME/DVD/zwei
.isoia/FILME/DVD/drei
.isora/FILME/DVD/vier

oder

deine version

/media//.iso
/media//.iso
/media//.iso
/media//.iso
 
Die Ausgabe mit "/media//.iso" kann ich nicht nachstellen.
Die andere schon, wenn mit nano im DOS-Format (CR/LF) gespeichert wird.
Wie Tumbleweed schon vermutet hat ist das Carriage Return ist dann die Ursache.

Hast Du beim Speichern mit nano von liste.txt dieses Bild (beachte das rot Unterstrichene)?
nano.png
Wenn Ja, drücke mal die Tasten-Kombi ALT+D, damit das "[DOS Format]" verschwindet und bestätige dann mit ENTER.
Es sollte beim speichern weder "DOS Format" noch "MAC Format" dort stehen.

PS:
Die Variante, dass für jede Zeile der Quelle nur "/media//.iso" ausgegeben wird, könnte ich z.Z. nur damit erklären, das der Variablenname beim read und beim echo nicht identisch (auch Groß-/Kleinschreibung) ist.
Im weiter oben geposteten Code ist dieser Fehler aber nicht vorhanden.
Ist der Code evtl. hier für das Forum nochmal leicht angepasst worden?
 
Zuletzt bearbeitet:
hallo HDscratcher,

ja das war tatsächlich die lösung (wenn ich auch nicht in der lage dazu wahr den speichermodus mit Alt-D zu ändern (sondern nur mit nano --noconvert) zu starten.

wer zum teufel denkt sich so einen mist aus, auf den kein normaler mensch kommt, den fehler hätt ich die nächsten 100 jahre nicht gefunden....
 

Ähnliche Themen

Zurück
Oben