Bash - Problem mit verschachtelten Schleifen

Diskutiere Bash - Problem mit verschachtelten Schleifen im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Hallo, ich habe bei einem Skript ein Problem mit einer If-Schleife in einer While-Schleife, das Skript soll auf mehreren Servern SQL-Befehle...

  1. peshay

    peshay Grünschnabel

    Dabei seit:
    12.01.2009
    Beiträge:
    3
    Zustimmungen:
    0
    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 }')
    
     
  2. #2 floyd62, 12.01.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    315
    Zustimmungen:
    0
    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
     
  3. peshay

    peshay Grünschnabel

    Dabei seit:
    12.01.2009
    Beiträge:
    3
    Zustimmungen:
    0
    Thx du bist der Meister! :)
     
Thema: Bash - Problem mit verschachtelten Schleifen
Besucher kamen mit folgenden Suchen
  1. bash for schleife verschachtelt

    ,
  2. bash mehrere schleifen

    ,
  3. bash verschachtelte for schleife

    ,
  4. bash schleifen verschachteln,
  5. linux in while schleife for verschachteln,
  6. bash geschachtelte schleifen,
  7. Linux Skript verschachtelte Schleifen,
  8. verschachtelte while schleife bash,
  9. Linux shell verschachtelte IF
Die Seite wird geladen...

Bash - Problem mit verschachtelten Schleifen - Ähnliche Themen

  1. bash esac problem

    bash esac problem: Hey, ich weiß nicht wie ich das problem hier lösen kann: #!/bin/bash func() { echo 'hello world' } select abm in 'Print hello...
  2. Sortierungsproblem Bash

    Sortierungsproblem Bash: Moin, ich hab ein kleines Problem mit ner output Sortierung von nem Bashscript. Folgendes Script: makemenuetop() { PWD=($1) #makemenue $1...
  3. Problem mit Rekursion in Bash / Funktioniert das überhaupt?

    Problem mit Rekursion in Bash / Funktioniert das überhaupt?: Hallo Allerseits, ich versuche gerade ein kleines Shell skript zu schreiben, welches bei einem gegebenen Verzeichnis alle darunter liegenden...
  4. Bash Verständnissproblem

    Bash Verständnissproblem: Hallo, ich habe mir vor einigen Monaten folgende Notiz zum Test einer Null-Modem-Verbindung 2er Computer via Bash gemacht: Serial Port Null...
  5. Variablen und Ersetzungsproblem in Bash

    Variablen und Ersetzungsproblem in Bash: Moin, ich hab da ein Problem, an dem ich seit Tagen sitze und keine Lösung finde. Vielleicht kann einer von euch da helfen. Angenommen ich...