[GELÖST] Schleifendurchlauf wiederholen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
thesecondjoker
Beiträge: 17
Registriert: 19.09.2006 00:36:30
Wohnort: Lüdenscheid

[GELÖST] Schleifendurchlauf wiederholen

Beitrag von thesecondjoker » 24.11.2012 03:30:29

Hallo zusammen,

ich benötige mal einen Denkanstoß ins Sachen Bash Scripting.

Ich habe ein Skript geschrieben, welches mir die Arbeit des Re-Muxing mit ffmpeg abnimmt. Dazu wird ein Verzeichnis per for-Schleife durchlaufen und bei jedem Durchlauf die entsprechende Datei verarbeitet. Nun führe ich zu Beginn des Skriptes ein Prüfung durch, ob die Zieldatei bereits existiert. Ist dies der Fall, dann prüft das Skript ob die Dateigröße passt (mind. 70% der Quelldateigröße) falls nicht (unter 70%), dann wird die Datei gelöscht und soll neu geschrieben werden. Dafür müsste ich den Schleifendurchlauf aber wiederholen.

Aus der Zeit von DOS Batchdateien gab es GOTO. Da ich keinen Wert auf Spaghetti Code lege, will ich etwas ordentliches haben, abgesehen davon, dass es meines Wissens kein GOTO in der Bash gibt. Allerdings wäre GOTO genau das was ich benötige, damit der Ablauf wieder genau zum Anfang der Schleife (im aktuellen Durchlauf) springt.

Gibt es aus eurer Sicht eine Möglichkeit das sinnvoll zu lösen? Wenn ja, wie?

Falls meine Erklärung nicht ganz ausgereicht haben sollte, hier mal ein Bsp.:

Code: Alles auswählen

for i in $DIRECTORY; do
  if [ ! -e $i ]; then
     Anweisung 1
     Anweisung 2
  else
     Anweisung 3
     Anweisung 4
  fi
done
Sobald die Anweisung 4 ausgeführt wurde, ist der Fehler behoben worden und dann könnten die Anweisungen 1 und 2 wieder ausgeführt werden.

Besten Dank im Voraus.


Gruß
tsj
Zuletzt geändert von thesecondjoker am 24.11.2012 23:14:06, insgesamt 1-mal geändert.

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Schleifendurchlauf wiederholen

Beitrag von JaKlaRo » 24.11.2012 08:09:34

thesecondjoker hat geschrieben: Ich habe ein Skript geschrieben, welches mir die Arbeit des Re-Muxing mit ffmpeg abnimmt. Dazu wird ein Verzeichnis per for-Schleife durchlaufen und bei jedem Durchlauf die entsprechende Datei verarbeitet. Nun führe ich zu Beginn des Skriptes ein Prüfung durch, ob die Zieldatei bereits existiert. Ist dies der Fall, dann prüft das Skript ob die Dateigröße passt (mind. 70% der Quelldateigröße) falls nicht (unter 70%), dann wird die Datei gelöscht und soll neu geschrieben werden. Dafür müsste ich den Schleifendurchlauf aber wiederholen.

Falls meine Erklärung nicht ganz ausgereicht haben sollte, hier mal ein Bsp.:

Code: Alles auswählen

for i in $DIRECTORY; do
  if [ ! -e $i ]; then
     Anweisung 1
     Anweisung 2
  else
     Anweisung 3
     Anweisung 4
  fi
done
Sobald die Anweisung 4 ausgeführt wurde, ist der Fehler behoben worden und dann könnten die Anweisungen 1 und 2 wieder ausgeführt werden.
Hallo,
in Deinem Beispiel wird immer nur der else-Teil ausgeführt, da i existiert (wird von der for-Schleife übergeben). Zu Deinem Problem:

Code: Alles auswählen

for i in $DIRECTORY; do
    if [ -e $ZIELDATEI ]; then
        if [ $ZIELDATEI < 70% ]; then
            rm $ZIELDATEI
        else
            continue
        fi
    fi
    ffmpeg -i $i ZIELDATEI
done
Gruß
JaKlaRo

thesecondjoker
Beiträge: 17
Registriert: 19.09.2006 00:36:30
Wohnort: Lüdenscheid

Re: Schleifendurchlauf wiederholen

Beitrag von thesecondjoker » 24.11.2012 09:57:53

Hallo JaKlaRo,
JaKlaRo hat geschrieben: Hallo,
in Deinem Beispiel wird immer nur der else-Teil ausgeführt, da i existiert (wird von der for-Schleife übergeben). Zu Deinem Problem:

Code: Alles auswählen

for i in $DIRECTORY; do
    if [ -e $ZIELDATEI ]; then
        if [ $ZIELDATEI < 70% ]; then
            rm $ZIELDATEI
        else
            continue
        fi
    fi
    ffmpeg -i $i ZIELDATEI
done
Gruß
JaKlaRo
vielen Dank für deine Antwort. Natürlich hast du recht. Hab ich nicht drüber nachgedacht. In meinem Skript sieht das ganze natürlich ein wenig anders aus - da wird auch nicht auf $i geprüft. ;-)

Leider hilft mir continue nicht weiter. Das hätte quasi den gleichen Effekt, den ich auch ohne erreichen könnte. Es würde nämlich nach der Anweisung 4 sowieso der nächste Durchlauf kommen.
Mein Ziel ist aber den aktuellen Durchlauf von $i nochmal auszuführen. Wenn also $i eingangs 1 ist, dann muss ich nach Anweisung 4 den Durchlauf mit 1 erneut durchführen und nicht mit $i=2 fortsetzen.


Gruß
tsj

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Schleifendurchlauf wiederholen

Beitrag von r900 » 24.11.2012 10:24:41

thesecondjoker hat geschrieben:vielen Dank für deine Antwort. Natürlich hast du recht. Hab ich nicht drüber nachgedacht. In meinem Skript sieht das ganze natürlich ein wenig anders aus - da wird auch nicht auf $i geprüft. ;-)
Dann stell doch gleich das richtige Skript hier rein, dann muss man kein Rätselraten spielen.. :wink: Im Prinzip würde ich bei so etwas das gewünschte als Funktion zu Beginn des Skripts definieren und es dann bei Bedarf an den erforderlichen Stellen aufrufen. Das kommt einem "GOTO" recht nahe.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Schleifendurchlauf wiederholen

Beitrag von Cae » 24.11.2012 11:25:47

Man kann eine Funktion schreiben (oder auch ein eigenes Skript), das manuell alle Argumente durchsteppt und irgendwas tut. Manuell hat den Vorteil gegenueber for ... in .. do ... done, dass man selbst entscheiden kann, wann es weiter geht:

Code: Alles auswählen

  1 #!/bin/sh
  2 
  3 do_something() {
  4         buf="$1";
  5         while test 0 -lt $#; do
  6                 if [ 1 -ne ${#buf} ]; then
  7                         echo '<-- BOOM';
  8                         buf=x;
  9                 else
 10                         buf="$1";
 11                         shift;
 12                 fi
 13 
 14                 echo -n " $buf ";
 15         done;
 16         echo;
 17 }
 18 
 19 do_something a b 1c d 1e f;

# output:
# a  b  1c <-- BOOM
# x  d  1e <-- BOOM
# x  f 
Zeile 5 wertet die Anzahl der verbleibenden Argumente aus ($#). Sofern die Laenge von $buf ungleich eins ist (Zeile 6), wird $buf auf x gesetzt und das naechste Argument *nicht* geholt. Dies passiert in Zeile 10/11, wenn das aktuelle Argument genau ein Zeichen umfasst.

Anstelle von buf=x; wuerdest du den korrigierenden Code hineinschreiben; der zwei Mal auszufuehrende Test ist hier durch echo -n " $buf "; symbolisiert.

do_something() kann man natuerlich auch zu globbende Argumente mitgeben, wie /foo/bar/* oder $DIR/test-nummer-?.m*. Wenn du nur den Teil innerhalb der Funktion in eine eigene Datei packst, kannst du sie "ganz normal" ueber ./do_something a b c aufrufen, genauso, wie die Funktion aufgerufen wurde.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

thesecondjoker
Beiträge: 17
Registriert: 19.09.2006 00:36:30
Wohnort: Lüdenscheid

Re: Schleifendurchlauf wiederholen

Beitrag von thesecondjoker » 24.11.2012 23:13:15

Hallo zusammen,

brillante Idee mit der Funktion. Schade, dass ich nicht selber darauf gekommen bin! Das wird mein Problem definitiv lösen und den Code massiv verbessern!

Besten Dank!!

Gruß
tsj

Antworten