Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Globale Variable in gepipe'ter Schleife verändern?

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74

    Globale Variable in gepipe'ter Schleife verändern?

    Hallo zusammen,

    wenn ich eine Schleife habe, die eine Subshell startet, was z.B. bei einer Pipe wohl der Fall ist (??), wird eine globale Variable leider nicht verändert.

    Wie bekomme ich nun ein Schleifenergebnis aus der Schleife heraustransportiert?

    Z.B.:
    Code:
    txt=0
    ls -1 /var/log|while read line;do
      txt="$line;$txt"
    done
    echo $txt
    Ergebnis ist: 0 anstatt der aneinandergeketteten Dateinamen...

    Grüße, Florian

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    warum nicht einfach
    Code:
    txt=0
    for line in /var/log/*
    do
      txt="$line;$txt"
    done
    echo $txt
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von jeebee Beitrag anzeigen
    warum nicht einfach
    Code:
    txt=0
    for line in /var/log/*
    do
      txt="$line;$txt"
    done
    echo $txt
    Vorsicht. Das geht nur in bestimmten Fällen gut:
    Code:
    jan@jack:~/tmp/leer> ll
    insgesamt 0
    -rw-r--r--  1 jan users 0 2007-09-23 14:19 datei mit leerzeichen.txt
    jan@jack:~/tmp/leer> for i in *; do
    > echo "<$i>"
    > done
    <datei mit leerzeichen.txt>
    jan@jack:~/tmp/leer> for i in `ls`; do echo "<$i>"; done
    <datei>
    <mit>
    <leerzeichen.txt>
    jan@jack:~/tmp/leer> echo "Text mit Leerzeichen" >datei\ mit\ leerzeichen.txt
    jan@jack:~/tmp/leer> for i in `cat datei\ mit\ leerzeichen.txt`; do
    > echo "<$i>"
    > done
    <Text>
    <mit>
    <Leerzeichen>
    Für die unteren Fälle kann man z. B. mit IFS arbeiten, oder die while-Schleife so nutzen:
    Code:
    jan@jack:~/tmp/leer> f=`ls | while read i; do echo -n $i; done`
    jan@jack:~/tmp/leer> echo $f
    datei mit leerzeichen.txtdatei_ohne_leerzeichen.txt
    Jan

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74
    Hallo zusammen,

    ihr versteift euch auf das ls, aber das ist nicht meine Frage, sorry.

    Ich will ganz allgemein wissen, wie ich das mache! Dieses "ls /var/log" steht nur als dummy für eine x-beliebige Eingabe...

    Grüße, Florian

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von qeldroma Beitrag anzeigen
    Hallo zusammen,

    ihr versteift euch auf das ls, aber das ist nicht meine Frage, sorry.

    Ich will ganz allgemein wissen, wie ich das mache! Dieses "ls /var/log" steht nur als dummy für eine x-beliebige Eingabe...

    Grüße, Florian
    Das ls in meinem unteren Code-Schnipsel steht auch für eine x-beliebige Eingabe, genau wie die for-Bedingung bei jeebee und die Beispiele, die ich für die Gefahren von leerzeichenbehafteten Eingaben in einer for-Schleife hergenommen habe.

    Ich dachte, es wäre klar geworden: Entweder auf eine Pipe (und damit Subshell) verzichten oder die in der Subshell ermittelten Werte per stdout nach oben durchreichen.

    Jan

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2002
    Beiträge
    74
    verdammt, ich habe meinen Fehler:
    Code:
    data="$(mysql ...... -e 'select name from users')"
    for i in $data;do
      echo $id
    done
    Ergebnis war eine Leerzeile...warum nur

    So ein Mist, ich danke euch vielmals für die Mühe

    Grüße, Florian

Lesezeichen

Berechtigungen

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