bash-shell-script zwei Variablen in einer for Schleife
Ich bin neu in shell-scripting. so freundlich haben Sie Geduld mit mir, wenn meine Frage zu dumm.
Habe ich png-Bilder in 2 verschiedene Verzeichnisse und eine ausführbare Datei, die nimmt Bilder von jedem Verzeichnis und verarbeitet Sie zu erzeugen ein neues Bild.
Ich bin auf der Suche nach einer for-Schleife konstruieren, die zwei Variablen gleichzeitig..das ist möglich in C, C++ usw, aber wie kann ich etwas erreichen der folgenden. Der code ist natürlich falsch.
#!/bin/sh
im1_dir=~/prev1/*.png
im2_dir=~/prev3/*.png
index=0
for i,j in $im1_dir $im2_dir # i iterates in im1_dir and j iterates in im2_dir
do
run_black.sh $i $j
done
Dank!
Sind Sie auf der Suche nach der "Kartesisches Produkt"? Zum Beispiel, wenn Verzeichnis-1-Dateien A, B, C und Verzeichnis 2 Dateien a b c, Sie sind auf der Suche für die 9-Ausgabe-Dateien (Aa, Ab, Ac, Ba, Bb, Bc, Ca, Cb, Cc) Recht?
Ich denke der OP will Aa Bb Cc eher als ein Kartesisches Produkt.
mich auch, aber darüber nachzudenken, es zu viel, machte mich unsicher
Ich bin sorry, wenn meine Frage unklar ist. aber ich bin nicht auf der Suche für das kartesische Produkt. Nur-Bild-Datei-Namen aus zwei verschiedenen Verzeichnissen.
Ich denke der OP will Aa Bb Cc eher als ein Kartesisches Produkt.
mich auch, aber darüber nachzudenken, es zu viel, machte mich unsicher
Ich bin sorry, wenn meine Frage unklar ist. aber ich bin nicht auf der Suche für das kartesische Produkt. Nur-Bild-Datei-Namen aus zwei verschiedenen Verzeichnissen.
InformationsquelleAutor snowmonkey | 2012-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie abhängig sind von den zwei Verzeichnissen zu vergleichen, basierend auf einem Gebietsschema sortiert (wie Sie versucht), dann ein array funktionieren sollte.
sorry ich meine Klammern ~/prev1/*.png
Das ist so, weil /bin/sh und nicht bash. Änderung der shebang #!/bin/bash
jordanm vielen Dank..ja ich merkte, dass
Sollte es nicht kleiner sein als ("<"), und nicht gleich oder kleiner als ("<=")? Es scheint mir, es macht einen Zyklus mor ethan notwendig.
InformationsquelleAutor jordanm
Hier sind ein paar zusätzliche Möglichkeiten, das zu tun, was Sie suchen, mit Notizen über die vor-und Nachteile.
Folgende funktioniert nur mit Dateinamen, die enthalten keine Zeilenumbrüche. Es Paare die Dateien im Gleichschritt. Es verwendet ein extra file-Deskriptor zum Lesen aus der ersten Liste. Wenn
im1_dir
enthält mehrere Dateien, die Schleife Stoppt, wennim2_dir
abläuft. Wennim2_dir
enthält mehr Dateien,file1
leer sein wird für alle, die unübertroffenefile2
. Natürlich, wenn Sie enthalten die gleiche Anzahl von Dateien, es gibt kein problem.Können Sie das Verhalten konsistent, so dass die Schleife beendet mit nur nicht-leere abgestimmt Dateien, egal, welche Liste länger ist, durch ersetzen des Semikolon mit eine doppelte kaufmännisches und-Zeichen wie folgt:
Diese version verwendet eine
for
- Schleife statt einerwhile
Schleife. Dieser Stoppt, wenn die kürzere der beiden Listen führen.Diese version ist ähnlich wie die einer unmittelbar darüber, aber wenn eine der Listen läuft es wickelt sich um die Wiederverwendung der Elemente, bis der andere leer ist. Es ist sehr hässlich, und Sie könnte das gleiche tun, eine andere Art und Weise mehr einfach.
Diese version nur ein array verwendet, für die innere Schleife (zweite Verzeichnis). Es wird nur ausgeführt, so oft aus, wie die Dateien im ersten Verzeichnis.
InformationsquelleAutor Dennis Williamson
Wenn Sie nichts dagegen haben, gehen abseits der ausgetretenen Pfad (bash), der Tool Command Language (TCL) hat so ein loop-Konstrukt:
Grundsätzlich der Schleife liest: für jeden abbildung1 entnommen list1, und item2 genommen von liste2. Sie können dann ersetzen Sie
command_name
mit Ihrem eigenen Befehl.InformationsquelleAutor Hai Vu
Es ist sehr einfach, können Sie zwei für die loop-Funktionen in diesem problem.
InformationsquelleAutor Thanh
Könnte dies ein weiterer Weg, um die Verwendung von zwei Variablen in der Schleife. Aber Sie müssen wissen, die Gesamtzahl der Dateien (oder die Anzahl der Zeiten, die Sie möchten, führen Sie die Schleife) in das Verzeichnis, um es zu benutzen, als der Wert der iteration
i
.Bekommen, die Anzahl der Dateien im Verzeichnis:
Führen Sie nun die Schleife:
Weitere Hilfe finden Sie in diesem Diskussion.
InformationsquelleAutor Rashedul Islam
Habe ich dieses problem für eine ähnliche situation, wo ich möchte einen oberen und unteren Bereich gleichzeitig. Hier war meine Lösung; es ist nicht besonders effizient, aber es ist einfach und sauber und überhaupt nicht kompliziert mit eklig BASH arrays und all diesen Unsinn.
InformationsquelleAutor John Haberstroh
Andere Lösung. Die zwei Listen mit Dateinamen eingefügt.
InformationsquelleAutor Fritz G. Mehner