Bash - Problem mit verschachtelten Schleifen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von peshay, 12.01.2009.

  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. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 floyd62, 12.01.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    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
     
  4. 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. Linux Skript verschachtelte Schleifen

    ,
  2. verschachtelte while schleife bash

    ,
  3. 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...