2 Listen in einer for Schleife abarbeiten

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von fencingline, 21.02.2008.

  1. #1 fencingline, 21.02.2008
    fencingline

    fencingline Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    37
    Zustimmungen:
    0
    Hallo zusammen,

    Betriebssystem ist Suse Linux mit SH-Shell.

    Ich möchte folgendes machen:

    Code:
    VAR1="/pfad1/"
    VAR2="/pfad2/"
    
    VAR3="${VAR1}1 ${VAR1}2 ${VAR1}3"
    VAR4="${VAR2}1 ${VAR2}2 ${VAR2}3"
    
    for AUSGABE3 in $VAR3 AUSGABE4 in $VAR4
    do
      echo $AUSGABE3
      echo $AUSGABE4
    done
    Rauskommen (bzw. benötigt wird) sollte dann so etwas:

    Code:
    /pfad1/1
    /pfad2/1
    /pfad1/2
    /pfad2/2
    /pfad1/3
    /pfad2/3
    Hoffe mein Problem kommt so einigermaßen rüber, ansonsten bitte noch mal nachfragen.

    Liebe Grüße

    FL
     
  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 Aqualung, 21.02.2008
    Aqualung

    Aqualung Routinier

    Dabei seit:
    12.02.2008
    Beiträge:
    404
    Zustimmungen:
    0
    Mann kann Schleifen schachteln, d.h.

    Code:
    for ... 
     do 
        for ..
         do
         ...
         done
     done
    HTH Aqualung
     
  4. #3 Wolfgang, 21.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Wenn dein sh ein Link auf die bash ist, dann sieh dir mal brace expansion an.
    Code:
    $ for i in /path{1,2}/{1,2,3,4,5};do echo $i;done
    /path1/1
    /path1/2
    /path1/3
    /path1/4
    /path1/5
    /path2/1
    /path2/2
    /path2/3
    /path2/4
    /path2/5
    
    Gruß Wolfgang
     
  5. #4 fencingline, 21.02.2008
    fencingline

    fencingline Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    37
    Zustimmungen:
    0
    Ja klar, aber dann wird doch immer die innere Schleife zuerst abgearbeitet ... oder nicht?

    Ich will ja die beiden Listen quasi zeitgleich abarbeiten.

    Aber ich teste deine vorgeschlagene Variante dennoch mal.
     
  6. #5 Gott_in_schwarz, 21.02.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Code:
    VAR17="/path/to/god"
    VAR23="/path/to/nietzsche"
    
    MAJUSKULOESE_VARIABLE=( ${VAR17}1 ${VAR17}3 ${VAR17}5 )
    VARIABLE42=( ${VAR23}wtf ${VAR23}hihi ${VAR23}omg )
    
    for i in {0..2}; do
        echo ${MAJUSKULOESE_VARIABLE[$i]}
        echo ${VARIABLE42[$i]}
    done
    das ist getestet auf der bash, nicht sh. desweiteren ist es scheinbar nicht möglich die anzahl der elemente dynamisch einzulesen wie etwa hier:
    Code:
    for i in {0..$(($(echo ${VARIABLE42[@]}|wc -w)-1))}; do echo 'so gehts leider nicht =('; done
    und selbst wenn es so gegangen wäre, hätten die arrays immer gleichlang sein müssen.. (korreliert ja aber soweit mit deiner "aufgabenstellung"..)
     
  7. #6 fencingline, 21.02.2008
    fencingline

    fencingline Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    37
    Zustimmungen:
    0
    Hallo noch mal,

    vielleicht war meine Aufgabenstellung doch nicht so ganz klar.

    Zunächst noch einmal zur Shell (wie kann ich diese rauskriegen?). Ich meine, dass ich die Bash habe:
    Code:
    server:~ # shufiu
    bash: shufiu: command not found
    So, und nun zu der Aufgabe:
    In einer Schleife muss ich zwei verschiedene Pfade abarbeiten. Dazu muss ich beim ersten Schleifendurchgang stehen in "/pfad1/1" und "/pfad2/1", im zweiten Schleifendurchgang "/pfad1/2" und "/pfad2/2", im dritten Schleifendurchgang "/pfad1/3" und "/pfad2/3", usw.

    Hmmm ... wie könnte ich es noch besser erklären?
     
  8. #7 Gott_in_schwarz, 21.02.2008
    Zuletzt bearbeitet: 21.02.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    müsste afaik mit
    Code:
    $ echo $0
    gehen. die version solltest du dann per:
    Code:
    $ $(echo $0) --version
    herausfinden können.

    joar, hast du dir meinen vorschlag mal angeschaut?


    edit:
    noch ne idee: (diesmal mit deinen nichtssagenden variablen-bezeichnern..)
    Code:
    VAR1="/pfad1/"
    VAR2="/pfad2/"
    
    var_arr=( "${VAR1}1\n${VAR2}1" "${VAR1}2\n${VAR2}2" "${VAR1}3\n${VAR2}3" )
    
    for i in ${var_arr[@]}; do
        printf "${i}\n"
    done
    edit: oha, useless use of arrays :0
    so gehts natürlich auch ohne: (und ist für dich vielleicht einfacher nachzuvollziehen)
    Code:
    VAR1="/pfad1/"
    VAR2="/pfad2/"
    
    meta_var="${VAR1}1\n${VAR2}1 ${VAR1}2\n${VAR2}2 ${VAR1}3\n${VAR2}3"
    
    for i in $meta_var; do
        printf "${i}\n"
    done
     
  9. #8 Wolfgang, 21.02.2008
    Zuletzt bearbeitet: 21.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Naja, schau halt mit ls was /bin/sh ist.
    Code:
    wolle@Nietzsche:/tmp
    $ ls -l /bin/sh
    lrwxrwxrwx 1 root root 4 2007-02-03 16:42 /bin/sh -> bash
    
    POSIX entsprechend sollte das sein.
    Code:
    wolle@Nietzsche:/tmp
    $ for i in $(seq 1 1 5);do for a in $(seq 1 2);do echo /path${a}/${i};done;done
    /path1/1
    /path2/1
    /path1/2
    /path2/2
    /path1/3
    /path2/3
    /path1/4
    /path2/4
    /path1/5
    /path2/5
    
    Gruß Wolfgang
     
  10. #9 fencingline, 21.02.2008
    Zuletzt bearbeitet: 21.02.2008
    fencingline

    fencingline Mitglied

    Dabei seit:
    21.04.2007
    Beiträge:
    37
    Zustimmungen:
    0
    Code:
    GNU bash, version 3.00.16(1)-release (i586-suse-linux)
    Copyright (C) 2004 Free Software Foundation, Inc.
    Ich werde jetzt mal noch mal ein bisschen testen und mich dann wieder melden.

    Vielen Dank erst mal so weit!
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Das sieht schon mal sehr gut aus!

    Wenn du mir noch verraten könntest, wie ich die einzelnen Zeilen, die mir printf so schön formatiert, wieder in einzelne Variablen bekomme?

    Dann wäre das für mich die Lösung, die ich auch verstehe. Und das ist ja wichtig. ;)

    Danke trotzdem auch für alle anderen Lösungsansätze!
     
  11. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  12. #10 Gott_in_schwarz, 21.02.2008
    Zuletzt bearbeitet: 21.02.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    naja, halt mit printf und dann in ein array packen oder gleich eine for-schleife drüber iterieren lassen:
    Code:
    var="bla\nblub"
    var_arr=( $(printf $var) )
    echo ${var_arr[0]}  # ausgabe: bla
    echo ${var_arr[1]}  # ausgabe: blub
    oder mit for-schleife:
    Code:
    var="bla\nblub"
    for i in $(printf $var); do echo $i; done
    wobei diese printf variante eigentlich schon ein ziemlicher hack ist :x
    nimm lieber meine erste variante mit den zwei arrays, das ist schöner. außerdem geht das ja nun doch mit der dynamischen schleifen-größe, seq respektive wolfgang sei dank \o/
    Code:
    bla="/path/1"
    blub=( ${bla}1 ${bla}2 ${bla}3 )
    number_of_items=$(( $(echo ${blub[@]}|wc -w) - 1))
    for i in $(seq 0 $number_of_items); do
        echo ${blub[$i]}
    done
    das dann halt noch mit 2 arrays statt mit einem...

    edit: naja, die variable "number_of_items" sollte eher "index_of_last_item" heißen, oder "number_of_items_minus_one"...
     
  13. #11 Wolfgang, 21.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Indem du statt der Ausgabe eine Zuweisung verwendest.
    Wobei du hier eine statische Variante nutzt.
    Was wenn du soetwas mal mit 100 über 20 machen musst?
    Na egal:
    Code:
    NEWVAR=$i;
    
    Aber wozu?
    Warum nicht gleich selbst verarbeiten?


    Gruß Wolfgang
     
Thema: 2 Listen in einer for Schleife abarbeiten
Besucher kamen mit folgenden Suchen
  1. python listen abarbeiten

Die Seite wird geladen...

2 Listen in einer for Schleife abarbeiten - Ähnliche Themen

  1. PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren

    PYTHON: Listen innerhalb einer Liste nach einem bestimmten Feld sortieren: Hallo zusammen, folgendes Problem: Ich habe eine Liste in der viele Listen vorhanden sind: a = [ ['Name', 'Vorname', 'Alter'], ['Name',...
  2. Hundertserver sucht Dich: Linux Spezialisten in Berlin.

    Hundertserver sucht Dich: Linux Spezialisten in Berlin.: Hundertserver sucht einen Linuxspezialiten in Berlin Hundertserver über sich: "Hundertserver bietet Unternehmen die Möglichkeit, digitale...
  3. Rogue Wave übernimmt PHP-Spezialisten Zend

    Rogue Wave übernimmt PHP-Spezialisten Zend: Der PHP-Spezialist Zend Technologies wurde durch Rogue Wave aufgekauft. Mit der Übernahme will sich der US-Cross-Plattform-Hersteller verstärkt in...
  4. Listen vergleichen

    Listen vergleichen: Hallo liebe Community, ich stehe wohl auf dem Schlauch und weiss nicht mehr weiter, vielleicht weil ich besser penne gehen sollte :D Wie auch...
  5. Mailinglistenarchive

    Mailinglistenarchive: Hallo, ich nutze rege Mailinglisten um mich mit der Community austauschen zu können. Nun ist es aber nicht selten der Fall, dass jeder...