• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

For mit Schleifenzähler

Hallo,

ich bin durch Zufall hier http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_009.htm#RxxKap00600904004E2B1F04E1AB 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:
#!/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.
 

abgdf

Guru
Bevor Du irgendwas in die Schleife schreibst, teste sie erstmal mit print, bzw. echo:
Code:
#!/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.
 

marce

Guru
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?
 

abgdf

Guru
Aber grundsätzlich bist Du natürlich ein zu Lobender, daß Du Dich mit diesen Fragen beschäftigen möchtest. ;)
 
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).
 

MH1962

Member
bunter fisch schrieb:
Code:
#!/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:
sh -x ./test.sh
Damit werden alle durchlaufenen Zeilen des Scriptes ausgegeben.
 

uhelp

Member
Code:
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
 
Oben