Bash - Problem mit verschachtelten Schleifen

P

peshay

Grünschnabel
Hallo, ich habe bei einem Skript ein Problem mit einer If-Schleife in einer While-Schleife, das Skript soll auf mehreren Servern SQL-Befehle ablassen.
Hier der Part, der mir Schwierigkeiten bereitet.
Code:
 while read liste; do
	# set variables from server database
	HOST=$(echo $liste | awk '{ print $1 }')
	PORT=$(echo $liste | awk '{ print $2 }')
	OUSER=$(echo $liste | awk '{ print $3 }')
	DBUSER=$(echo $liste | awk '{ print $5 }')
	DBPASS=$(echo $liste | awk '{ print $6 }')
	if CheckHost $HOST $PORT $OUSER; then
		# write log info
		echo --------- Executing command at $HOST ---------  | tee -a logfile
		# create command
		echo -e "connect $DBUSER/$DBPASS;\n$(cat $commandfile)\nexit;" >$tmpfile
		$ssh -p $PORT $OUSER@$HOST <$tmpfile "cat >command
			source .profile 2>/dev/null
			cat command | sqlplus -S /nolog
			rm command
		" 2>&1 | tee -a logfile
	else 
		Hint connection to $HOST could not be established. >>logfile
	fi
done < ~/remote-cmd-script/dbliste
Die Funktion CheckHost(), prüft nur ob der hostname richtig ist, ein ping geht und ein kurzer ssh funktionert. Sie gibt mir auch den return code 0 zurück was ich zum Beispiel mit einem "&& echo $?" dahinter geprüft habe.
Die If-Schleife läuft dann einmal durch, anschließend wird die While-Schleife beendet, obwohl noch viele weitere Einträge in der dbliste sind.
Wenn ich die If-Schleife raus nehme, läuft das Skript komplett über alle Einträge in der dbliste.
Mir ist irgendwie nicht klar, was mit dieser If-Schleife nicht stimmt.
Ich habe auch schon ein set -x reingesetzt, das Skript beendet sich mit If-Schleife dann so:
Code:
+ echo -e 'connect corpus/corpus;\nselect login from party where login like '\''sumuser'\'';\nexit;'
+ ssh -o BatchMode=yes -p 22 user@somehost 'cat >command
+ tee -a logfile
				source .profile 2>/dev/null
				cat command | sqlplus -S /nolog
				rm command
			'

LOGIN
----------------------------------------------------------------
sumuser

logout
+ read liste
+ OnExit
+ set +x
Als würde die liste auf einmal nichts mehr liefern...

Achja, ein Tipp wie ich die Variablen einfacher befüllen kann als so, wäre auch echt nett:
Code:
HOST=$(echo $liste | awk '{ print $1 }')
 
Auf den ersten Blick sieht das Skript ganz OK aus. Kann das sein, daß in der CheckHost-Funktion irgendein Kommando läuft ("cat ...", "while read ...", oder "ssh" ohne Eingabeumlenkung oder "-n"-Option), das dann effektiv den Input frisst, der in die Schleife gelangen soll? Eventuell kannst du den Aufruf dieser Funktion mal so abändern:
Code:
if CheckHost $HOST $PORT $OUSER </dev/null; then

Zur zweiten Frage: statt
Code:
while read liste; do
        HOST=$(echo ... | awk ...)
        PORT=...
...
sollte ein einfaches
Code:
while read HOST PORT OUSER _JUNK_ DBUSER DBPASS; do
        ...
done <list
eigentlich ziemlich dasselbe erreichen ... (die _JUNK_-Variable enthält damit dann das 4. Feld in deiner Liste, das du ja scheinbar nicht benötigst.)

Gruss
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Shellskript - Fehler in Cron

Zurück
Oben