Seite 1 von 1

For mit Schleifenzähler

Verfasst: 15. Mär 2018, 16:36
von bunter fisch
Hallo,

ich bin durch Zufall hier http://openbook.rheinwerk-verlag.de/she ... 2B1F04E1AB auf For-Schleifen mit Zähler gestoßenund wollte das mal probieren. Leider sind die Bsp. etwas kryptisch. Angenommen ich möchte eine For-Schleife x mal durchlaufen lassen und dabei jeweils eine Datei mit einer Nummer erstellen lassen, die beide jedem Durchlauf um 1 erhöht wird.

Code: Alles auswählen

#!/bin/bash
DATE=`date '+%Y-%m-%d-%H:%M:%S'`
for((i=5; i>0 ;i++))
 do
  touch neu-$DATE
  sleep 1
 done
Ich habe jetzt hier statt einem Zähler ein Datum mit Uhrzeit einsetzen lassen, da ich nicht weiß, was ich anstelle von 'DATE' einfügen muss um dort einen Zähler zu haben. Aber auch so geht das Script so nicht. Ich dachte es werden 5 Dateien mit unterschiedlichen Uhrzeiten erstellt (daher sleep, damit es keine doppelten Namen gibt), es wird aber nur eine erstellt und das Script wird im Terminal nicht beendet. Irgendwie bleibt es im 1. Durchlaufen hängen.

Re: For mit Schleifenzähler

Verfasst: 15. Mär 2018, 16:48
von abgdf
Bevor Du irgendwas in die Schleife schreibst, teste sie erstmal mit print, bzw. echo:

Code: Alles auswählen

#!/bin/bash

for((i=1; i<=5; i++))
do
    echo $i
done
Die Syntax stammt von C. Das erste ist der Anfangswert; das zweite die Bedingung, solange die Schleife läuft; das dritte, was bei jedem Durchlauf mit der Variable passieren soll.
Vielleicht interessiert Dich meine Seite.

Re: For mit Schleifenzähler

Verfasst: 15. Mär 2018, 17:26
von marce
abgesehen davon: Du definierst / belegst / weißt einen Wert zu DATE vor der Schleife - und gibst den in der Schleife dann aus. Mehrfach. Den Wert, den Du vorher festgelegt hast.

... woher soll den DATE in der Schleife einen neuen Wert bekommen?

Re: For mit Schleifenzähler

Verfasst: 15. Mär 2018, 20:30
von abgdf
Aber grundsätzlich bist Du natürlich ein zu Lobender, daß Du Dich mit diesen Fragen beschäftigen möchtest. ;)

Re: For mit Schleifenzähler

Verfasst: 15. Mär 2018, 22:42
von Geier0815
Ganz ehrlich: Mit der Anleitung (das openbook) hätte ich es auch nicht verstanden. Wenn dich das Thema shell-skripte interessiert kann ich dir das Buch "Shell Skript Programmierung" aus dem mitp-Verlag empfehlen. Wenn es etwas günstiger sein soll, such eine gebrauchte Ausgabe (4.Auflage).

Re: For mit Schleifenzähler

Verfasst: 16. Mär 2018, 04:38
von MH1962
bunter fisch hat geschrieben:
15. Mär 2018, 16:36

Code: Alles auswählen

#!/bin/bash
DATE=`date '+%Y-%m-%d-%H:%M:%S'`
for((i=5; i>0 ;i++))
 do
  touch neu-$DATE
  sleep 1
 done
Ich habe jetzt hier statt einem Zähler ein Datum mit Uhrzeit einsetzen lassen, da ich nicht weiß, was ich anstelle von 'DATE' einfügen muss um dort einen Zähler zu haben. Aber auch so geht das Script so nicht. Ich dachte es werden 5 Dateien mit unterschiedlichen Uhrzeiten erstellt (daher sleep, damit es keine doppelten Namen gibt), es wird aber nur eine erstellt und das Script wird im Terminal nicht beendet. Irgendwie bleibt es im 1. Durchlaufen hängen.
Nö. Du hast eine Endlos-Schleife produziert. Das Script läuft solange i>0 ist, und nach jedem Durchlauf wird i um eins erhöht, bleibt also größer als Null.

Du wolltest i-- schreiben...

Und Datei wird nur eine erstellt - und das unendlich oft - weil die Variable ja nicht in der Schleife geändert wird.

Tipp noch am Rande:

Code: Alles auswählen

sh -x ./test.sh
Damit werden alle durchlaufenen Zeilen des Scriptes ausgegeben.

Re: For mit Schleifenzähler

Verfasst: 7. Mai 2018, 21:12
von uhelp

Code: Alles auswählen

for ((i=0;i<10;i++)); do
    # das aktuelle Datum im Format 2018-05-07_21:15 in $datum speichern
    datum=$(date +"%Y-%m-%d_%H:%M")
    # eine Datei touchen. Du hast eine einzige Datei unendlich oft "getouched". Du Grapscher!
    touch someFileName$datum
    # sleep will Sekunden. Geht auch 2.5 für zweieinhalb. Beachte, dass ein Punkt im amerikanischen das deutsche Komma ist.
    # und wir wollen länger als eine Minute warten, damit wir nicht auch dieselbe Datei erwischen
    # also sleepen wir 65 Sekunden.
    sleep 65
    # du könntest als Formatstring für "date" auch +"%Y-%m-%d_%H:%M:%s" verwenden.
    # dann sind werden Sekunden auch Bestandteil des Namens
done