Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Bash-Problem mit "while read" ?

  1. #1
    Robby-TX5
    Gast

    Bash-Problem mit "while read" ?

    Hi

    ich habe folgendes Problem:

    Mein Script liest Informationen aus einer Datei, die anschließend weiter verarbeitet werden sollen. Um es simple zu machen, stehen in der Datei Name.txt die Namen "Klaus" und "Walter", die ausgelesen und unterschiedlich interpretiert werden.
    Code:
    #!/bin/bash
    #
    # testscript
    #
    
    admin_name="kein_Name_vorhanden"
    
    cat name.txt | while read name
    do
       case ${name} in
          Klaus) admin_name=${name}",_das_ist_gut" ;;
          Walter) admin_name=${name}",_das_ist_sogar_noch_besser" ;;
       esac
       printf "Admin-Name = %s \n" ${admin_name}
    done
    printf "Letzter eingelesener Admin-Name = %s \n" ${admin_name}
    
    exit 0
    Die Ausgabe sieht dann so aus:

    Code:
     ./testscript.sh
    Admin-Name = Walter,_das_ist_sogar_noch_besser
    Admin-Name = Klaus,_das_ist_gut
    Letzter eingelesener Admin-Name = kein_Name_vorhanden
    Obwohl die Schleifendurchläufe die Variable eindeutig verändern, besitzt die Variable am Ende den "alten" Urprungswert. D. h. auch, dass die While-Read-Schleife mit einer Kopie der Variablen arbeiten muss, welche aber nach am Ende der While-Schleife verloren geht.

    Wie komme ich denn an die veränderte Kopie der Variablen auch ausserhalb der Schleife?

    Thanks for helping.

    PS.: In einer "for ..... do" Schleife existiert das Problem nicht.
    PS.: Das Phänomen existiert auf Linux und AIX, mit verschiedene Kernel-Versionen ( 2.6.14.3, i386; 2.6.5-7.97-pseries64, AIX 5.1 ML5) mit der bash als auch mit der ksh. Witziger Weise gibt die ksh unter AIX (und nur unter AIX) das für mich richtige Ergebnis raus.
    Geändert von Robby-TX5 (10-02-2006 um 11:49 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    wenn du's so machst gehts
    Code:
    while read name
    do
       ... 
    done <name.txt
    religion is a virus from outer space

  3. #3
    Robby-TX5
    Gast
    @ninguno

    hey, danke.

    Kannst Du mir auch noch den Unterschied erklären, wieso das bei Deiner Variante klappt und bei meiner nicht?

    Danke

    Robby-TX5

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    du sendest die daten über eine pipe an deine while schleife, das heisst die ganze while schleife läuft in einem child prozess. die variable admin_name innerhalb der schleife ist eine andere (lokale) variable als admin_name ausserhalb derselben, die beiden heissen nur zufällig gleich.
    religion is a virus from outer space

  5. #5
    Robby-TX5
    Gast
    @ninguno

    hmm, das ist eine gute Erklärung. Da hätte man auch selbst drauf kommen können.

    Gibt es eine Möglichkeit, die veränderte Variable aus dem Child-Prozess dem "Eltern"-Prozess zurückzugeben?

    Robby

  6. #6
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    direkt nicht, aber ein möglicher umweg wäre command substitution
    Code:
    admin_name="kein_Name_vorhanden"
    
    admin_name=`cat name.txt | while read name
    do
       case ${name} in
          Klaus) admin_name=${name}",_das_ist_gut" ;;
          Walter) admin_name=${name}",_das_ist_sogar_noch_besser"
                  echo ${admin_name} ;;
       esac
    done`
    
    printf "Letzter eingelesener Admin-Name = %s \n" ${admin_name}
    religion is a virus from outer space

  7. #7
    Robby-TX5
    Gast
    ja, .... nee, ..... habe ich ausprobiert.

    Damit werden alle Ausgaben innerhalb der Schleife der Variablen übergeben. Die Ausgabe lautet dann ....

    Code:
    Letzter eingelesener Admin-Name = Admin-Name = Walter,_das_ist_sogar_noch_besser Admin-Name = Klaus,_das_ist_gut
    Naja egal, ich werde Deinen ersten Ansatz umsetzen.

    Robby

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •