Wie zeilenweises abarbeiten eines Parameters?

  • Hi,


    folgendes BeispielSzenario. Ein Parameter enthält mehrere Zeilen:


    CMD=`ls -rtl`| awk {printf("%s\n", $2)}


    Dieses möchte ich nun zeilenweise verarbeiten. Ich denke dazu brauche ich eine while-Schleife. Aber wie kann ich auf die jeweils aktuelle Zeile zugreifen? Wie lautet meine abbruchbedingung.? Folgendes funktioniert nicht und ist eher als Pseudocode zu verstehen:


    while [ $CMD !EOF ]; do
    echo "Inhalt der aktuell zu verarbeitenden Zeile: $CMD"
    done;


    Kann mir jemad auf die Sprünge helfen? Zu dieser Problemamatik hab ich noch nix im INet gefunden....

    :vdr1 VDR User #626:fans
    VDR II: YeongYang A106, Fusi D1522, Celeron 2GHz, Frontend per DVB-s FF, 2xDVB-c, ATRIC-IR, YaVDR 0.3a
    VDR III HDTV: Inter-Tech 2008V mit iMonLCD, Atric, ASRock Extreme3 770 AM3, AMD Sempron 140 1x 2.70GHz AM3, 1,5TB WD15EADS, 2TB WD20EARS, 2x4GB DDR3-1600, NVidia GT520 passiv, 3x DVB-c, YaVDR 0.5 @ Samsung PS-50B550

  • ok, so könnte mans machen, aber dann hab ich auch keine möglichkeit mehr die ursprungliche Variable noch anderweitig zu nutzen?? Werd´s gleich mal heute abend ausprobieren....


    hab noch was gefunden, würde das ev so funktionieren?


    BspCMD=`ls -rtl`
    for var in $BspCMD ; do
    echo "aktuelle Zeile: $var"
    done


    gruss

    :vdr1 VDR User #626:fans
    VDR II: YeongYang A106, Fusi D1522, Celeron 2GHz, Frontend per DVB-s FF, 2xDVB-c, ATRIC-IR, YaVDR 0.3a
    VDR III HDTV: Inter-Tech 2008V mit iMonLCD, Atric, ASRock Extreme3 770 AM3, AMD Sempron 140 1x 2.70GHz AM3, 1,5TB WD15EADS, 2TB WD20EARS, 2x4GB DDR3-1600, NVidia GT520 passiv, 3x DVB-c, YaVDR 0.5 @ Samsung PS-50B550

    Einmal editiert, zuletzt von Tobias ()

  • hi Sparkie,


    das ist nur ein BEispiel und soll die Mehrzeiligkeit in der Variable CMD verdeutlichen. Wenn ich hier das eigentliche Statement hinschreibe isses schon so kompliziert dass keiner mehr weiter ließt....


    gruss

    :vdr1 VDR User #626:fans
    VDR II: YeongYang A106, Fusi D1522, Celeron 2GHz, Frontend per DVB-s FF, 2xDVB-c, ATRIC-IR, YaVDR 0.3a
    VDR III HDTV: Inter-Tech 2008V mit iMonLCD, Atric, ASRock Extreme3 770 AM3, AMD Sempron 140 1x 2.70GHz AM3, 1,5TB WD15EADS, 2TB WD20EARS, 2x4GB DDR3-1600, NVidia GT520 passiv, 3x DVB-c, YaVDR 0.5 @ Samsung PS-50B550

  • Hallo!



    Das funktioniert nur, wenn "ls -rtl" (bzw. der Befehl) keine Leerzeichen enthält. Das ist hier eben nicht der Fall.
    Versuch's so:

    Code
    BspCMD=`ls -rtl`
    printf "$BspCMD\n" | while read ZEILE
    do
    echo "aktuelle Zeile: $ZEILE"
    done


    Gruß,
    Andreas

  • hi,
    bin ein stück weiter. JEtzt habe ich das PRoblem dass ich innerhlab einer Schleife einer VAriablen einen Wert zuweise, dieser Wert nach Beendigung der Schleife aber wieder auf Default steht??
    ICh find den FEhler nicht....



    Mein Sorgenkind ist $DIREXIST. Es wird auf 1 gesetzt, nach der Schleife steht aber DIREXIST wieder auf 4....
    Sihet jemand was auf Anhieb??

    :vdr1 VDR User #626:fans
    VDR II: YeongYang A106, Fusi D1522, Celeron 2GHz, Frontend per DVB-s FF, 2xDVB-c, ATRIC-IR, YaVDR 0.3a
    VDR III HDTV: Inter-Tech 2008V mit iMonLCD, Atric, ASRock Extreme3 770 AM3, AMD Sempron 140 1x 2.70GHz AM3, 1,5TB WD15EADS, 2TB WD20EARS, 2x4GB DDR3-1600, NVidia GT520 passiv, 3x DVB-c, YaVDR 0.5 @ Samsung PS-50B550

    Einmal editiert, zuletzt von Tobias ()

  • Hi!



    Das geht nicht, da die Schleife in einer Untershell läuf und die Variable ist dann nur lokal in dieser.


    Gruß,
    Andreas

  • Zitat

    Originally posted by Tobias
    bin ein stück weiter. JEtzt habe ich das PRoblem dass ich innerhlab einer Schleife einer VAriablen einen Wert zuweise, dieser Wert nach Beendigung der Schleife aber wieder auf Default steht??
    ICh find den FEhler nicht....


    Klassiker. Durch das Pipe läuft die While-Schleife in einer Subshell. Beim Beenden gehen dann alle Variablen verloren. Von einem Schleifendurchlauf zum nächsten bleiben sie dagegen erhalten.


    Alternativen:


    Process Substitution:

    Code
    while read line ; do
      ...
    done < <(printf "%s\n" $TEST)

    Here Strings:

    Code
    while read line ; do
      ...
    done <<< "$(printf "%s\n" $TEST)"


    Here Strings eignen sich für eher kürzere Dinge, sie werden über die Kommandozeile abgewickelt. Process Substitution arbeitet mit Pipes und kann daher mit beliebigen Dateilängen umgehen, auch mit länger laufenden Programmen. Falls die Daten eh aus einer Shell-Variable kommen, sind Here Strings sogar einfacher: done <<< "$TEST".


    Gruß,


    Udo

  • danke!!! Das wars....
    Jetzt weiß ich endlich was das "<<" immer am ende einer while-schleife bedeutet....


    gruss

    :vdr1 VDR User #626:fans
    VDR II: YeongYang A106, Fusi D1522, Celeron 2GHz, Frontend per DVB-s FF, 2xDVB-c, ATRIC-IR, YaVDR 0.3a
    VDR III HDTV: Inter-Tech 2008V mit iMonLCD, Atric, ASRock Extreme3 770 AM3, AMD Sempron 140 1x 2.70GHz AM3, 1,5TB WD15EADS, 2TB WD20EARS, 2x4GB DDR3-1600, NVidia GT520 passiv, 3x DVB-c, YaVDR 0.5 @ Samsung PS-50B550

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!