• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[GELÖST] read innerhalb einer "while read" Schleife??

Hallo, ich nu wieder.

Ich habe ein kleines Problem:

Ich lese Eine Datei (safe.conf) zeilenweise ein und übergebe die Zeile an ein Programm:

Code:
while read line
do
  #rsync führt die angegebenen Parameter aus 
  rsync $line
  
  #Rückgabewert von rsync wird an fehler übergeben:
  fehler=$?
  
  #hier wird aus der jeweiligen Parameterzeile der safe.conf das 4. und 5. Wort (Quellverzeichnis und Zielverzeichnis) ausgelesen.
  #IFS ist der Trenner, hier ein Leerzeichen.
  IFS=" "
  set -- $line
  quelle=$4
  ziel=$5
    
  #Auswertung der Rückgabewerte
    if test $fehler -eq 0;
       then
       echo "Das Verzeichnis $quelle wurde ohne Fehler nach $ziel gesichert - ALLES OK!"
       sleep 5
       clear
     elif test $fehler -gt 0;
       then
       echo "Beim Sichern des Verzeichnisses $quelle wurde der Fehler $sau gemeldet- SYSADMIN KONSULTIEREN!"
       sleep 5
       clear
     else
       #Die Bedingungsauswertung könnte Unfug ergeben deshalb noch 
       echo "Unbekannter Drecksfehler - SYSADMIN KONSULTIEREN!"
       sleep 5
       exit 255
    fi	    
done < /home/ingo/Programme/safe.conf

Jetzt würde ich gerne eine J/N Tastatureingabe mit "read -n1 -t5 JN" in der if Abfrage einführen.
um einen vorzeitigen Abbruch machen zu können:

Code:
  #Auswertung der Rückgabewerte
    if test $fehler -eq 0;
       then
       echo "Das Verzeichnis $quelle wurde ohne Fehler nach $ziel gesichert - ALLES OK!"
       sleep 5
       clear
       
       #*****************************
       #Hier der gewünschte read befehl:
       echo "a für Abbruch drücken"
       read -n1 -t5 JN
       #und zum Testen
       echo "$JN"
      
       if test JN=a
         then exit 1
       fi 
       ******************************
          
    elif test $fehler -gt 0;
       then
       echo "Beim Sichern des Verzeichnisses $quelle wurde der Fehler $fehler gemeldet- SYSADMIN KONSULTIEREN!"
       sleep 5
       clear
     else
       #Die Bedingungsauswertung könnte Unfug ergeben deshalb sicherheitshalber noch 
       echo "Unbekannter Drecksfehler: $fehler - SYSADMIN KONSULTIEREN!"
       sleep 5
       exit 255
    fi	    
done < /home/ingo/Programme/safe.conf

Leider gibt "echo "$JN" mir immer den Inhalt der Variable line (also der aus safe.conf ausgelesene String) aus.
Die übergabe an JN funktioniert nicht, wahrscheinlich darf man in einer "while read line" Schleife "read" nicht nochmal ausführen... :irre:

Kann ich Tastatureingaben auch mit einem anderen Befehl einlesen?
Für Ideen wie immer dankbar.
 
Hallo Ingo,

mit der ksh hat so etwas bei mir schon funktioniert. Folgender Codeausschnitt zeigt ein Menu in einer Endlosschleife an bis e gedrückt wird.

Code:
mchoice=""
while [ "$mchoice" != "e" ]
do
  #----------------------------------------------------------------------------
  # Menupunkte anzeigen
  #----------------------------------------------------------------------------
  :
  :
  #----------------------------------------------------------------------------
  # Auswahl abfragen
  #----------------------------------------------------------------------------
  echo "\n      Auswahl: \c"
  read mchoice
  mchoice=`echo $mchoice | tr 'E' 'e'`
  :
  :
done

Gruß
Georg
 
@spoensche:

read zeigt mir immer noch den gestreckten Mittelfinger. "-p" wird ignoriert, weil ich ja das file als input habe.
Frage:
Wenn ich das file mit "cat" öffne, so was wie:
Code:
befehlszeile=cat /filename
echo $befehlszeile
hätte ich den doppelten read Aufruf umgangen...?
Ich gehe mal manpages von cat googeln, vielleicht kommen noch andere Ideen.
 
ingo.trautwein schrieb:
Die übergabe an JN funktioniert nicht, wahrscheinlich darf man in einer "while read line" Schleife "read" nicht nochmal ausführen...
Du brauchst einen File-Descriptor:
Code:
#!/bin/bash

exec 3< safe.conf
while read <&3 line
do
   echo $line
   echo -n "Eingabe: "
   read a
   echo "Eingabe war: '$a'"
done
http://www.itworld.com/nls_unix_filedescriptor060608
http://stackoverflow.com/questions/2087188/how-to-read-using-read-from-file-descriptor-3-in-bash-script

;)
 
@spoensche:
Sorry, ich habe mich unklar ausgedrückt, ich wollte natürlich nicht die Eingabe mit cat lesen, sondern damit das safe.conf file mit den
Befehlszeilen einlesen und an die Variable übergeben, anstelle der "while read line" Anweisung.

Ich probier nun mal das mit dem Deskriptor und berichte.
 
@abgdf:
Das war's. :D :D
Ich habe wohl mit dem Konstrukt:
Code:
while read line
 do
done < Datei
das "read" blockiert, so daß es keine Eingaben mehr von der Konsole annehmen konnte.
Oder gibt es da noch 'ne professionellere Erklärung?

Danke an alle, für die Tipps und Links.
Wieder mal viel dazugelernt.
 
Hallo Ingo,

blockiert ist der Input nicht, aber mit der Angabe eines Files ohne weitere Spezifikation werden einfach alle read Anweisungen auf dieses File angewendet. Oder anders ausgedrückt das Input File ersetzt den Standard Input. Deshalb enthält deine $JN Variable Daten aus dem File.

Dass man beliebige Filedescriptoren verwenden kann wusste ich allerdings auch nicht. Ich kannte nur 0,1, und 2.
So habe ich auch etwas Neues gelernt.

Grüße
Georg
 
Oben