Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

18.07.2007, 05:51

[gelöst] Shellscript - will einfach nicht ...

Hallo allerseits,

habe ein kleines Script geschrieben, um mich wieder ein wenig in Sachen Shell und Linux fit zu machen.

Script bricht mit Fehlermeldung(en)
./s1: line 87: unexpected EOF while looking for matching `"'
./s1: line 90: syntax error: unexpected end of file
ab.

Script soll aus einer Datei ("wert1" "wert2" "wert3" "wert4";), die zuvor autom. mit echo $bla >> generiert wurde, auslesen und diese dann verarbeiten.

Ausserdem wird bei dem Script nicht mal die zu Testzwecken eingefügten echo "Test..." ausgegeben.
Die einzulesende Datei habe ich auch schon manuell erstellt, nix hilft.

Format der Datei process.list:

1184429935.25616.datei 9050-LS3 2007-07-15 20070715-1200
...
...

Mein Script:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/bash

zaehler1=0
zaehler2=0
zaehler3=0

cd /tmp_process/tempMARCHIVein

if [ -f process.list ]; then

echo "Processlist ist da"

# a = Name der Email
# b = Client
# c = Tag (2007-07-15)
# d = Zeit (20070715-1810)

	while read vara varb varc vard; do

		if [ -f $vara ]; then

			echo "Datei "$vara" wurde gefunden"

			echo $vara > /tmp/tmp100
			laenge=`expr length $vara`

			if [ $laenge -gt 50 ]; then  # Ausgangsmail oder Trashmail
				NEUNAME=`cut -c1-28 /tmp/tmp100`
			else
				NEUNAME=`cut -c1-17 /tmp/tmp100`
			fi

			echo $NEUNAME > /tmp/tmp100

			if [ $laenge -lt 50 ]; then  # Eingangsmail
				sed s/[a-z]// /tmp/tmp100 > /tmp/tmp200
				SUCHNAME=`cat /tmp/tmp200`
				NEUNAME=$SUCHNAME"ein"
			else
				SUCHNAME=`cat /tmp/tmp100`
				NEUNAME=$SUCHNAME".ein"
			fi

			SUCHNAME2="Mailcode: "$NEUNAME

			echo "Suchname 1: "$SUCHNAME 
			echo "Suchname 2: "$SUCHNAME2 
			echo "Neuname 1: "$NEUNAME 
			echo "Email: "$vara
		
			grep $SUCHNAME2 "/tmp_process/DATEN/MARCHIV/"$varb"/WORK/logfile.EIN"

			if [ $? -eq 0 ]; then       # schon erfasst
				echo "ignore" > /dev/null
			else
				MSGCODE=$(date '+%Y%m%d%H%M%S%N')
				echo "ST-"$MSGCODE" ============================================================" > tmp_logfile
				echo "Code: "$vara" " >> tmp_logfile
				echo "Mailcode: "$NEUNAME" >> tmp_logfile
				echo "Location: "$varb"/"$varc"/"$vard >> tmp_logfile

				grep "From:" $vara >> tmp_logfile
				grep "To: \<" $vara >> tmp_logfile
				grep "Subject:" $vara >> tmp_logfile
				grep "Date:" $vara >> tmp_logfile
				grep "Received: " $vara >> tmp_logfile
				grep "X-Spam-Status:" $vara >> tmp_logfile
				echo "EN-"$MSGCODE" ============================================================" >> tmp_logfile

				cat tmp_logfile >> "/tmp_process/DATEN/MARCHIV/"$varb"/WORK/logfile.EIN"
				cat tmp_logfile >> "/tmp_process/DATEN/MARCHIV/"$varb"/WORK/"$varc"_logfile.EIN"
				rm -f tmp_logfile

				mv $a $NEUNAME
				cp -p $NEUNAME "/tmp_process/DATEN/MARCHIV/"$varb"/WORK/EINGANG"
				let zaehler1=$zaehler1+1
				rm -f /tmp/tmp*
			fi
		fi
	done <process.list

fi
echo "FERTIG"


Ich verzweifle echt langsam, das Ding will einfach nicht laufen und ich habe keine Ahnung wieso.

1000Dank für jeden Tipp!

Gruss
Mike

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

18.07.2007, 08:31

RE: Shellscript - will einfach nicht ...

das ding ist doch voller fehler!
zb

Quellcode

1
echo "Datei "$vara" wurde gefunden"

was soll das werden?, wozu die anführungszeichen bei $vara??
besser
echo "Datei ${vara} wurde gefunden"

Quellcode

1
if [ -f $vara ]; then

besser
if [ -f "${vara}" ]; then

Quellcode

1
SUCHNAME2="Mailcode: "$NEUNAME

besser
SUCHNAME2="Mailcode: ${NEUNAME}"

Quellcode

1
echo "EN-"$MSGCODE" ===========================================================">>tmp_logfile

besser
echo "EN-${MSGCODE}============================================================">> tmp_logfile
oder falls die anführungszeichen mit ausgegeben werden sollen
echo "EN-\"${MSGCODE}\"===========================================================">> tmp_logfile

Quellcode

1
cp -p $NEUNAME "/tmp_process/DATEN/MARCHIV/"$varb"/WORK/EINGANG"

besser
cp -p $NEUNAME "/tmp_process/DATEN/MARCHIV/${varb}/WORK/EINGANG"

usw usf .....
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »linuxerr« (28.10.2007, 22:56)


3

18.07.2007, 08:41

Hallo,

danke für die Hinweise.
Allerdings ist das gepostete Script die xxx-Version, ich habe fast alles geändert, mit anderer Syntax probiert usw.
Die Variablen ${varname} usw. habe ich in der Finalversion schon auch drinnen.
Habe sogar das while read durch for ersetzt und sogar auch mit arrays gearbeitet (die einzelnen Werte sogar manuell in das File reingeklopft).
Das Resultat ist immer gleich:

die Fehlermeldung mit Verweis auf Dateiende.
Die kommt übrigens auch, wenn ich die komplette Schleife while ...done weglasse, also gleich ins IF reingehe.

Wenn ich im Absatz echo "....." >> tmp_logfile den Befehl mv $vara neuername einfüge, wird er ausgeführt, sprich: die IF wird ausgeführt, doch warum kommen die testweisen ECHOs nicht ????

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

18.07.2007, 08:53

fehlermeldungen, die auf das scriptende hindeuten, haben oft was mit fehlerhaften bedingungen, schleifen oder quotungen zu tun, die irgendwo im quelltext stehen.
warum da was nicht geht, kann ich dir nicht sagen, wenn ich den quellcode nicht kenne, von dem du redest.
führe das script doch einfach ,mit option -x aus und verfolge was die bash meldet.
/bin/bash -x /pfad_da_hin/scriptname
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

18.07.2007, 10:42

sys.005: /tmp_process/tempMARCHIVein # /bin/bash -x prog1
+ zaehler1=0
+ zaehler2=0
+ zaehler3=0
+ cd /tmp_process/tempMARCHIVein
prog1: line 92: unexpected EOF while looking for matching `"'
prog1: line 94: syntax error: unexpected end of file

Das Original (gekürzt um 2 weitere IFs, aber die sind inhaltlich bis auf Kleinigkeiten identisch)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash


zaehler1=0
zaehler2=0
zaehler3=0


# EINGANG
cd /tmp_process/tempMARCHIVein

if [ -f process.list ]; then

	echo "STEP-1"

# a = Name der Email
# b = Client
# c = Tag (2007-07-15)
# d = Zeit (20070715-1810)

	while read a b c d
	do

		AUSGABE="/tmp_process/DATEN/MARCHIV/${b}/WORK/logfile.EIN"
		AUSGABE2="/tmp_process/DATEN/MARCHIV/${b}/WORK/${c}/logfile.EIN"

		echo "STEP-2"

		if [ -f $a ]; then

			echo "STEP-3"

			echo $a > /tmp/tmp100
			laenge=`expr length $a`

			if [ $laenge -gt 50 ]; then  
				NEUNAME=`cut -c1-28 /tmp/tmp100`
			else
				NEUNAME=`cut -c1-17 /tmp/tmp100`
			fi

			echo $NEUNAME > /tmp/tmp100

			if [ $laenge -lt 50 ]; then  
				sed s/[a-z]// /tmp/tmp100 > /tmp/tmp200
				SUCHNAME=`cat /tmp/tmp200`
				NEUNAME=$SUCHNAME"ein"
			else
				SUCHNAME=`cat /tmp/tmp100`
				NEUNAME=$SUCHNAME".ein"
			fi

			SUCHNAME2="Mailcode: ${NEUNAME}
		
			grep $SUCHNAME2 $AUSGABE

			echo "STEP-4"

			if [ $? -eq 0 ]; then       # schon erfasst
				echo "STEP-5a"
			else
				echo "STEP-5b"
######
###### => hier der Befehl  mv $a $MSGCODE wird ausgeführt !
######
				MSGCODE=$(date '+%Y%m%d%H%M%S%N')
				echo "ST-${MSGCODE} ============================================================" > tmp_logfile
				echo "Code: ${a}" >> tmp_logfile
				echo "Mailcode: ${NEUNAME}" >> tmp_logfile
				echo "Location: ${b} / ${c} / ${d}" >> tmp_logfile

				grep "From:" $a >> tmp_logfile
				grep "To: \<" $a >> tmp_logfile
				grep "Subject:" $a >> tmp_logfile
				grep "Date:" $a >> tmp_logfile
				grep "Received: " $a >> tmp_logfile
				grep "X-Spam-Status:" $a >> tmp_logfile
				echo "EN-${MSGCODE} ============================================================" >> tmp_logfile

				cat tmp_logfile >> $AUSGABE
				cat tmp_logfile >> $AUSGABE2
				rm -f tmp*

				mv $a $NEUNAME
				cp -p $NEUNAME "/tmp_process/DATEN/MARCHIV/${b}/WORK/EINGANG"
				let zaehler1=$zaehler1+1
			fi
		fi
	done < process.list

#	rm -f process.list

fi

echo "FERTIG"



Die Datei process.list

Quellcode

1
2
1184404262.23953.condor.domain.tld 9050-LS3 2007-07-15 20070715-1200
...


testweise mit 5 identischen Einträgen manuell (sogar über vi) erstellt.

Ergebnis immer gleich.

/EDIT:
ich habe nahezu jeden einzelnen Befehl auskommentiert, was aber am Ergebnis nichts geändert hat (selbst ein fehlendes if mit vorhandem fi wurde nicht mal erwähnt)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MIKE bt« (18.07.2007, 10:44)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

18.07.2007, 11:02

na er meldet doch, dass er ein problem mit dem matching hat, er sucht irgendeins der hochkommate, das nicht geschlossen wird. zb hier
SUCHNAME2="Mailcode: ${NEUNAME} in zeile 53.
vielleicht solltest du ja teile in dem script in funktionen definieren, das erleichtert die fehlersuche erheblich.

es ist übrigens unnötig das tmp-file für die ausgabe anzulegen, du kannst die kommandos in einer subshell aufrufen und die ausgabe dann umleiten, zb

Quellcode

1
2
3
4
(
echo "blah"
echo "blah"
) > $AUSGABE 
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

7

18.07.2007, 11:08

was sollen eigentlich diese greps machen???

Quellcode

1
2
3
4
5
6
grep "From:" $a >> tmp_logfile
				grep "To: \<" $a >> tmp_logfile
				grep "Subject:" $a >> tmp_logfile
				grep "Date:" $a >> tmp_logfile
				grep "Received: " $a >> tmp_logfile
				grep "X-Spam-Status:" $a >> tmp_logfile
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

8

18.07.2007, 11:23

Thanks ....
das Hochkomma war wahrscheinlich ein Kopierfehler hier, im Script sind alle "" '' geschlossen.

Die greps ?
Ziehen bestimmte Infos (zeilenweise) aus einer Datei raus.

Das Script stoppt also bereits vor dem ersten IF.
Auch eine andere Bedingung, eine Negierung, andere Kriterien, eine WHILE-Schleife aussenrum - es nützt nichts.

Und noch schlimmer:
ich habe das Teil jetzt nochmal Wort für Wort abgetippt, um wirklich alle evtl. doch noch vorhandenen Sonderzeichen zu eleminieren: Fehlanzeige !

/OT
das Script ist ja nur zum üben. Ich bin schon lange aus Linux und Shell sowie C raus, die letzten Jahre eigentlich nur PHP, Perl und c# gemacht. Wollte wieder ein wenig reinkommen und bevor ich sinnlos aus Büchern was abtippe, mache ich eben selbst was einigermassen nützliches.

Ziel:
Sende von Handy/PDA eine Email an den Server, ein Script wertet die Mails periodisch aus, parst diese und führt dann bestimmte Aktionen (nach Keywords) aus.
Die Mails werden archiviert und entsprechende Protokolle angelegt.

Der letzte Teil (archivieren) und Protokoll fehlen noch - tja, würde mich nur interessieren, ob das evtl. ein Problem vom Kernel sein könnte ...

9

18.07.2007, 11:53

PROBLEM GELÖST !

Ich habe den Rechner neu gestartet, bin als root reingegangen und das Script arbeitet einwandfrei - ohne irgendwelche Änderungen !

Merci für die Hilfe !

Darf ich noch eine Frage stellen ???

mit welchem Befehl kann ich aus einer Textdatei einen Zeilenbereich (z.B. 3-8) anzeigen lassen ?

Datei:

START
erste Zeile
zweite Zeile
dritte Zeile
ENDE
START
erste Zeile
zweite Zeile
ENDE

wobei das START und ENDE nicht mit angezeigt werden soll, sondern nur der variable Teil dazwischen.

Mit awk könnte es gehen, aber damit bin ich noch nicht so vertraut.
Geht es auch mit einer Kombination aus grep sed ? Oder muss ich das ganze zeilenweise einlesen, Mustererkennung, Zwischenteil merken und dann ausgeben ?

Danke nochmal für einen Hinweis.

Gruß
Mike

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

10

18.07.2007, 11:58

das hat mit dem kernel absolut nichts zu tun, das ist ein fehler im script. poste doch mal das ganze script, so wie es jetzt ist als dateianhang und noch eine beispieldatei process.list dazu.
ich schau mir das mal an.

wie gesagt, funktionen solltest du benutzen, das macht das script modular und übersichtlicher.

noch etwas, bekommt das script noch daten von stdin oder welche datei sollen die greps da durchsuchen? in $a steht doch der name der mail oder ist das ein dateiname?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

11

18.07.2007, 12:30

Hallo,

kein Input, weder von STDIN noch aus anderen Scripten/Prozessen.

Anbei:
prog1
process.list
ein Beispiel für $a

die logfile.EIN ist nur ein Eintrag ("Mailcode: 112313123123.123123.ein"), die
grep suchen in den logfile.EIN, ob schon ein Eintrag mit $a existiert und sie suchen in den $a (=Emaildateien) die entsprechenden Informationen und schreiben sie ebenfalls ins log.

Noch einen Tipp zu obiger Frage ??
»MIKE bt« hat folgende Dateien angehängt:
  • process.list (5,18 kB - 6 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)
  • prog. (1,88 kB - 10 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)
  • 1184345069.10095.ein (949 Byte - 5 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

12

18.07.2007, 12:43

da wirst du sicherlich mit awk oder perl am besten fahren. sed müsste auch gehen, da sed seit einiger zeit auch zeilenübergreifend arbeiten kann.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

13

18.07.2007, 21:57

Danke, dann mache ich mich mal über sed schlau, muss ja Shellscript üben, nicht Perl.
Werde mal sehen, ob ich zum (neuen) sed die passenden Infos finde.

Vorerst mal vielen Dank für die Hilfe.

Mike

Thema bewerten