ubuntuusers.de

Scriptgesteuertes einlesen und verarbeiten von Dateinamen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

ireng

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Hallo Community,

ich erbitte nochmal eure Mithilfe und Unterstützung.

Es liegen eine große Anzahl von Source Dateien mit der Endung .f90 (Ja, es gibt noch die FORTRAN Programmierer) in einem Verzeichnis. Ich möchte alle Dateien einzeln einlesen, einzeln als Object Datei compilieren und zum Schluss alle Object Dateien als shared library linken.

Ich habe noch ein Problem mit dem einlesen der Datei mit der Endung .f90 und der Übergabe an den Compiler.

BEISPIEL:

1
2
3
4
5
6
#!/bin/bash
if  [ "$1" = "*.f90" ]; then
	gfortran $1 -c
else
	gcc -fPIC -shared -Wl,-soname,libnumerik1.so.1 -o libnumerik1.so.1.0  *.o -lc
fi

das funktioniert allerdings nur ein einziges Mal.

Was muss ich ändern, damit dieses Script nacheinander auf alle Dateien im Verzeichnis angewendet wird ?

Ich bedanke mich jetzt schon mal recht herzlich für Eure Unterstützung und Verbesserungsvorschläge.

LG, IRENG

Bearbeitet von redknight:

Codeblock spendiert

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

Auf alle Dateien in einem Verzeichnis?

1
2
3
4
for file in *
do 
#Dein Code
done

zum Beispiel

ireng

(Themenstarter)

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Hallo redknight,

danke für Deinen Vorschlag. Ich habe mein script mit Deinem Vorschlag abgeändert.

Leider funktioniert es nicht ganz so wie gewünscht. der Aufruf ./comppshl_numerik1 *.f90 wendet das script auf die erste gefundene Datei solange an, bis alle Dateien abgearbeitet sind. Komisch.....

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

vielleicht schadet auch ein Blick in Richtung make oder ein anderes Buildtool nicht. ☺

ireng

(Themenstarter)

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Servus Vain,

danke für Deinen Hinweis und Ratschlag. Ich wollte halt nur ein paar Zeilen in ein script schreiben und das dann auf alle Dateien anwenden lassen, ohne mich mit einem komplexen buildtool befassen zu müssen!

LG, IRENG

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

ireng schrieb:

Leider funktioniert es nicht ganz so wie gewünscht. der Aufruf ./comppshl_numerik1 *.f90 wendet das script auf die erste gefundene Datei solange an, bis alle Dateien abgearbeitet sind. Komisch.....

Naja, die if-Abfrage müsstest du entsprechend zu den Variablen ändern, du willst ja file überprüfen und nicht das Argument ,)

ireng

(Themenstarter)

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Hallo redknight,

danke für Deinen Hinweis. Im Moment bekomme ich nichts gebacken.....

Ich hab eine Reihe von Änderungen vorgenommen, aber es hilft nicht.......

Nichts klappt so, wie ich es mir vorstelle!

LG, IRENG

unmensch

Anmeldungsdatum:
29. Mai 2010

Beiträge: 170

Magst du uns vielleicht deinen aktuellen Versuch zeigen?

ireng

(Themenstarter)

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Hi,

das ist mein letzter Versuch:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
for file in *
do
	echo $file
if [ file  = "*.f90" ]; then
	$1 = file$
	gfortran $1 -c -o
else
#	exit 0
	echo "Hello World!"
fi	
done
	gcc -fPIC -shared -Wl,-soname,libnumerik1.so.1 -o libnumerik1.so.1.0  -lc

Wie lauten Eure Verbesserungsvorschläge ?

Danke IRENG

Bearbeitet von redknight:

Codeblöcke!

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

ireng schrieb:

Wie lauten Eure Verbesserungsvorschläge ?

Zuerst mal, dass du die Forensyntax benutzt, speziell Codeblöcke. Ich dachte eigentlich, dass man Programmierern nicht erklären muss, wie wichtig es ist Code strukturiert lesbar zu machen.

Dann dachte ich auch nicht, dass man Programmierer mit einer for-Schleife überfordert, Fortran hat sowas bestimmt auch. Also nochmal in kleinen Schritten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
for file in * #Alle Dateien im Verzeichnis bearbeiten
do
 if [[ $file = "*.f90"]]; then
  gfortran $file -c -o
 else
  echo "Hello World!" # Warum überhaupt ein Else-Zeweig, wenn du nichts drin machst?
 fi
done
gcc -fPIC -shared -Wl,-soname,libnumerik1.so.1 -o libnumerik1.so.1.0  -lc

Oder noch besser, da kürzer und übersichtlicher:

1
2
3
4
5
6
#!/bin/bash
for file in *.f90 # Alle Quellcodedateien verarbeiten
do
 gfortran $file -c -o #Kompiliervorgang
done
gcc -fPIC -shared -Wl,-soname,libnumerik1.so.1 -o libnumerik1.so.1.0  -lc #Linken

ireng

(Themenstarter)

Anmeldungsdatum:
17. Januar 2008

Beiträge: 263

Danke redknight!

Dein Vorschlag funktioniert! Vielen Dank für Deine Unterstützung.

Der If....then....else Zweig war nur für testzwecke eingebaut!

For Schleifen gibt es auch in FORTRAN!

Nochmals vielen Dank und einen schönen Sonntag wünscht

IRENG

Antworten |