2 Listen in einer for Schleife abarbeiten

F

fencingline

Mitglied
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
 
Mann kann Schleifen schachteln, d.h.

Code:
for ... 
 do 
    for ..
     do
     ...
     done
 done

HTH Aqualung
 
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
 
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.
 
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"..)
 
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?
 
Zunächst noch einmal zur Shell (wie kann ich diese rauskriegen?). Ich meine, dass ich die Bash habe:
müsste afaik mit
Code:
$ echo $0
gehen. die version solltest du dann per:
Code:
$ $(echo $0) --version
herausfinden können.

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.
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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
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) :
.

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
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!
 
Zuletzt bearbeitet:
Wenn du mir noch verraten könntest, wie ich die einzelnen Zeilen, die mir printf so schön formatiert, wieder in einzelne Variablen bekomme?

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"...
 
Zuletzt bearbeitet:
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
 

Ähnliche Themen

Wie komme ich an den Inhalt des Inhalts einer Variable?

Keine grafische Oberfläche (Debian Installation)

[gelöst] - for file in ... nur für bestimmte Endungen?

HandbrakeCLI Shell Skript

continue in Schleife einbauen

Zurück
Oben