Sie sind nicht angemeldet.

1

13.01.2006, 12:59

Werte aus einer Datei auslesen

Hi Leute,

schon mal Danke im Voraus für eure Hilfe.

Grundlage ist eine ini-Datei in der folgeden Daten enthalten sind:

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
        ini-Datei:

	#
	# Kopf
	#
	#
	##############
	#
	# Instanz 1
	#
	Instanz1.Server_Name=Testname
	Instanz1.SMTP_Server=Mailserver
	Instanz1.DB_Server=DBserver
	#
	# Instanz 2
	#
	Instanz2.Server_Name=Testname2
	Instanz2.SMTP_Server=Mailserver
	Instanz2.DB_Server=DBserver
	.
	.
	.
	#
	# Instanz X
	#
	InstanzX.Server_Name=TestnameX
	InstanzX.SMTP_Server=Mailserver
	InstanzX.DB_Server=DBserver
	#
	#Limits
	#
	Reply_Time=20
	Cache_Size=1024

Das Skript hat die Aufgabe in einer Schleife alle Instanzen zu durchlaufen, und die in der ini-Datei gespeicherten Werte
an verschiedene Skripte weiter zu geben.

Bis jetzt hab ich leider nur ein Skript dass alle Kommentare löscht und jede Zeile wieder ausgibt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        DATAFILE=$Path/config.ini

	#delete all comments and save in a temp file
	`cat $DATAFILE | sed '/#/d' > $Path/config.ini.temp`

	DATAFILETEMP=$Path/config.ini.temp
	exec 0< "$DATAFILETEMP"

	Line_Count=`wc $DATAFILETEMP | awk '{ print $1 }'`

	for line in `seq $Line_Count`
	do 
    		read line
		echo $line

	done

	#delete temp file
	`rm $DATAFILETEMP`

	exit 0

Wie bekomm ich es jetzt in meiner for-Schleife hin, dass die Werte (z.B. Testserver) in Variablen geschrieben werden.

Chucky the Devil

Pianist im Puff

  • »Chucky the Devil« ist männlich

Beiträge: 1 636

Wohnort: Koeln

Beruf: Network Architect

  • Nachricht senden

2

13.01.2006, 14:28

RE: Werte aus einer Datei auslesen

> DATAFILE=$Path/config.ini

> #delete all comments and save in a temp file
> `cat $DATAFILE | sed '/#/d' > $Path/config.ini.temp`
>
Useless use of cat und Du benutzt Kommandosubstitution wo keine benoetigt ist.

Quellcode

1
2
#delete all comments and save in a temp file
sed '/#/d' $DATAFILE > $Path/config.ini.temp


Einlesen von Variablen? Versuchs mit eval.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(doomy@prometheus)(765/pts/4)(02:27pm:01/13/06)-
(%:~)- cat blubb 
BLUBB=Blah
BLAH=Blubb

(doomy@prometheus)(766/pts/4)(02:27pm:01/13/06)-
(%:~)- for i in $(cat blubb); do eval $i; done 

(doomy@prometheus)(767/pts/4)(02:27pm:01/13/06)-
(%:~)- echo $BLUBB 
Blah
(doomy@prometheus)(768/pts/4)(02:27pm:01/13/06)-
(%:~)- echo $BLAH
Blubb

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

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

  • Nachricht senden

3

13.01.2006, 14:45

RE: Werte aus einer Datei auslesen

ähh mal eine frage am rande, warum bettest du die ini-datei nicht direkt in deine anderen scripte ein. dh wenn du die variablen der ini datei in einem script benötigst, geht das doch einfach mit

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
....
blah blah blah
....

if [ -e  /pfad_dahin/datei.ini ]; then
  . /pfad_dahin/datei.ini
  # damit sind die variablendefinitionen in das script includet
else
  echo "Huch, wo ist die ini???"
  exit 1
fi

blah blah
...

# und können zb ausgegeben werden
echo $Instanz1.Server_Name
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

4

02.02.2006, 10:59

Hi Leute,

konnte mich leider erst jetzt wieder mit diesem Problem befassen da was anderes wichtiger war.

@linuxerr hab deine Idee mit dem einbinden aufgenommen

allerdings braeuchte ich immer noch ein bisschen hifle bei der abarbeitung der Schleife
Da ich alle Instanzen abarbeiten will und dieses nicht fest in das Skript schreiben will.

Die Form der ini-Datei ist auch noch nicht fest. Dort könnte also auch noch was geändert werden.

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#! /bin/sh
#
#
# last change
# 12.01.2006
#
#
# 1. 12.01.2006 create file
#
#
# boundary conditions:
# 1. Script runs only under linux 
#
####################################################################################################

####################################################################################################
#
# Initialisierung der Umgebungsvariablen
# Pfad ist fuer alle anderen Skripte gültig
#
Path="Pfad"


#
#Ueberpruefen ob der letzte lauf ein Error.log hinterlassen hat wenn ja soll eine E-Mail versandt werden
#und der lauf nicht gestartet werden
#
if [ -e $Path/logs/Error.log ]; then
    
    #
    #TODO Mail an zustaendige Person
    #
    echo "Hier wird eine Mail an einen Personenkreis geschickt weil ein Error.log Datei besteht" 
    
    exit 1

else

    #
    # Ueberpruefen ob die benoetigten Konfigurationsdateien vorhanden sind
    #
    if [ -e $Path/config.ini ]; then
	CONFIGFILE=$Path/config.ini
	. $CONFIGFILE
    
	if [ -e $Path/limit.ini ]; then
	    LIMITFILE=$Path/limit.ini
	    . $LIMITFILE
	else
	    echo -en "Controller Error - limit.ini is not available - " >>$Path/logs/Error.log
	    date +%F-%a%t%R >> $Path/logs/Error.log  
   	    exit 1
	fi	 
	#
	#Datum und Zeit der Abfrage in 2 variablen schreiben 
	#    
	DATE=`date +%F` 
	TIME=`date +%H:%M`
		    
    
    
	#
	# Schleifenstart fuer die Instanzen
	#
	#
	#TODO
    	    
	
	    #
	    # Zuweisung der variablen aus der config.ini
	    #
	    INSTANCENAME=$Instanz1_Server_Name
	    INSTANCEPORT=$Instanz1_Server_Port
	    INSTANCEUSER=$Instanz1_MKS_User
	    INSTANCEPWD=$Instanz1_MKS_Pwd
	    SMTPHOST=$Instanz1_SMTP_Server
	    DBHOST=$Instanz1_DB_Server
	
	    echo -en "$Date;$TIME;$INSTANCENAME:$INSTANCEPORT;" >> $Path/logs/log.csv
	
	    #
	    # aufruf pingSMTP 
	    #
	    $Path/01_pingSMTP.sh $SMTPHOST $Path $SMTPREPLY
	
	    #
	    # aufruf pingDB
	    #
	    $Path/02_pingDB.sh $DBHOST $Path $DBREPLY
	
	    #
	    # Ueberpfuefen des OS
	    #
	    $Path/03_checkOS.sh $Path
	    
	    
	    #
	    # Eintrag des letzten Werte um die Zeile abzuschliessen
	    #
	    echo "ENDE" >> $Path/logs/log.csv
	    
	    #
	    # Ueberpruefen ob eines der Sktipte einen Fehler verursacht hat. 
	    #
	    if [ -e $Path/logs/Error.log ]; then
		#
		# loeschen der letzten Zeile in der CSV Datei
		#
		# TODO
		#
		`sed -e '$D' $Path/logs/log.csv > $Path/logs/temp.csv`
		`rm $Path/logs/log.csv`
		`mv $Path/logs/temp.csv $Path/logs/log.csv`
	    fi    
	#
	# Schleifenende fuer die Instanzen
	#
	#
	#TODO
    
    
            
    else
	echo -en "Controller Error - config.ini is not available - " >>$Path/logs/Error.log
	date +%F-%a%t%R >> $Path/logs/Error.log  
	exit 1
    fi   
fi
exit 0

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

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

  • Nachricht senden

5

02.02.2006, 13:17

damit wir nicht aneiander vorbeireden, versuche ich mal das script zuerst in einem pseudocode zu formulieren.
also

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
#! /bin/sh
#
#
........... ich mach hier was ......


........... und schaue hier und da



........... und komme zur schleife


 
	#
	# Schleifenstart fuer die Instanzen
	#
	#
	for aktuelle_instanz=Instanz1 to letzte_Instanz
        do
	    # Zuweisung der variablen aus der config.ini
	    #
	    INSTANCENAME=$aktuelle_instanz_Server_Name
	    INSTANCEPORT=$aktuelle_instanz_Server_Port
	    INSTANCEUSER=$aktuelle_instanz_MKS_User
	    INSTANCEPWD=$aktuelle_instanz_MKS_Pwd
	    SMTPHOST=$aktuelle_instanz_SMTP_Server
	    DBHOST=$aktuelle_instanz_DB_Server
	
	
           ...... so, jetzt mache ich mit den variablen was ganz verrücktes ....
        done
	# Schleifenende fuer die Instanzen
	#
	#
	
exit 0


ist das so korrekt???
frage ist noch, ob die instanzen alle von der ersten bis zur letzten durchnummeriert sind, oder ob zb zwischen Instanz5 und Instanz7 die Instanz6 fehlen kann?? denn die schleife benötigt ja eine abbruchbedingung.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

6

02.02.2006, 14:12

Hi,

soweit ich dass sehe ist dein Pseudocode richtig interpretiert.
Es sind auch alle Instanzen von Anfang bis Ende durchnummeriert, es kommen also keine Lücken vor.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

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

  • Nachricht senden

7

02.02.2006, 14:47

hallo,
hier ein vorschlag von mir:
1. die ini

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
#
# Kopf
#
#
##############
#
# Instanz 1
#
Instanz1_Server_Name=Testname
Instanz1_SMTP_Server=Mailserver
Instanz1_DB_Server=DBserver
#
# Instanz 2
#
Instanz2_Server_Name=Testname2
Instanz2_SMTP_Server=Mailserver
Instanz2_DB_Server=DBserver
#
# Instanz X
#
Instanz3_Server_Name=TestnameX
Instanz3_SMTP_Server=Mailserver
Instanz3_DB_Server=DBserver
#
#Limits
#
Reply_Time=20
Cache_Size=1024

die punkte in den instanznamen habe ich geändert, da es sonderzeichen sind die schwierigkeiten machen.
hier das 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
#!/bin/sh
#....
#blah blah blah
#....

PFAD_DA_HIN="."
if [ -e ${PFAD_DA_HIN}/instanz.ini ]; then
  . ${PFAD_DA_HIN}/instanz.ini
  # damit sind die variablendefinitionen in das script includet
else
  echo "Huch, wo ist die ini???"
  exit 1
fi

#blah blah
#...

# und können zb ausgegeben werden
#echo $Instanz1.Server_Name

#
# Schleifenstart fuer die Instanzen
#
#
INUMMER=1
while true
do
 # Zuweisung der variablen aus der config.ini
 #
 INSTANCENAME=$( eval echo \$Instanz${INUMMER}_Server_Name )
 INSTANCEPORT=$( eval echo \$Instanz${INUMMER}_Server_Port )
 INSTANCEUSER=$( eval echo \$Instanz${INUMMER}_MKS_User )
 INSTANCEPWD=$( eval echo \$Instanz${INUMMER}_MKS_Pwd )
 SMTPHOST=$( eval echo \$Instanz${INUMMER}_SMTP_Server )
 DBHOST=$( eval echo \$Instanz${INUMMER}_DB_Server )

 if [ "$INSTANCENAME" == "" ]; then
  break
 else
  let "INUMMER=INUMMER + 1"
  # hier gebe ich mal aus, was in den variablen steht
  echo "NAME=$INSTANCENAME"
  echo "PORT=$INSTANCEPORT"
  echo "USER=$INSTANCEUSER"
  echo "PWD=$INSTANCEPWD"
  echo "SMTP=$SMTPHOST"
  echo "DB=$DBHOST"
  #           ...... so, jetzt mache ich mit den variablen was ganz verrücktes
 fi
done
# Schleifenende fuer die Instanzen
#
#
exit 0

der index INUMMER zählt die instanzen und wird zur konkenation der variablennamen benutzt, die dann mit eval ausgelesen werden. die erste nicht definierte instanz liefert einen leeren INSTANZNAME und damit wird die schleife abgebrochen
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 2 mal editiert, zuletzt von »linuxerr« (02.02.2006, 14:49)


8

02.02.2006, 15:31

Danke hat Prima funktioniert!

Thema bewerten