2017-05-22 3 views
-1

Ich habe eine Anforderung, ein Unix-Skript für verschiedene Daten mehrmals auszuführen. Skript sollte zuerst für 2017-01-01 ausgeführt werden, dann für 2017-02-01 und so weiter. Wir überprüfen die Daten monatlich. Kann mir bitte jemand dabei helfen? Vielen Dank.Unix-Schleifen für Daten

+2

Dies ist, was das Dienstprogramm "cron" ist (oder, wenn Sie bestimmte Versionen von Linux verwenden, systemd Timer-Einheiten). –

+0

Danke. Ich suche keine geplante Ausführung. Aber wenn ich das Skript jetzt ausführe, muss es für den 1. Januar, 1. Februar, 1. März bis 1. Mai ausgeführt werden. Eingabewerte sollen der erste Tag eines jeden Monats sein. – NewToUnix

+0

Oh, ich denke ich sehe. –

Antwort

0

Sie können im Allgemeinen eine for-Schleife für die Iteration verwenden. Sie können eine Folge von Monaten mit {01..12} oder seq -w 1 12, wie unten erzeugen:

for date in 2017-{01..12}-01; do 
    echo Processing data for $date 
    # Use $date in some way 
done 

oder

for month in $(seq -w 1 12); do 
    date=2017-$month-01 
    echo Processing data for $date 
    # use $date in some way 
done 

Die erste wird in Bash arbeiten, zsh und viele andere Muscheln, aber ich glaube nicht, ist garantiert für jeden von ihnen zu arbeiten; der zweite sollte für jede sh-ähnliche Schale funktionieren.

+0

Danke. Gibt es eine Möglichkeit, das Skript für 2 Daten auszuführen? Beispiel, zuerst muss ich das Skript ausführen, um alle Datensätze zwischen dem 1. Januar und dem 31. Januar zu finden, dann muss ich Datensätze zwischen dem 1. Februar und dem 28. Februar finden und so weiter. Ich denke, das ist es, was wir mit mehr Verständnis für die Anforderung tun müssen. Gibt es eine Möglichkeit, das Skript zwischen zwei Daten zu wiederholen? – NewToUnix

+0

Das ist komplizierter, weil Sie Monate unterschiedlicher Längen behandeln müssen. Die Shell hat kein inhärentes Konzept von Datumsangaben. Sie müssen also entweder ein Programm in einer anderen Sprache schreiben, um die Datumsliste zu erstellen, und Sie benötigen eine Nachschlagetabelle für die Dauer jedes Monats Schaltjahre berücksichtigen!), oder Sie müssten das Skript bei einem ungültigen Datum wie '2017-04-31' oder' 2017-02-29' fehlerfrei ausführen. Es könnte einfacher sein, die Eingabeanforderungen zu ändern. –

+0

Das versuche ich zu erreichen. Anstatt die Schritte für mehrere Daten zu kopieren, gibt es eine Möglichkeit, Logik in eine Schleife einzufügen, mit einem dazwischen liegenden Schlaf: '#!/bin/bash für Datei in '2017-03-01' tun echo $ file für file1 in '2017.03.31' tun mit $ file1 #run Job echo $ $ file1 echo "Job done" Schlaf 10s in ‚für Datei getan getan Datei 2017- 04-01 ' do echo $ Datei für Datei1 in' 2017-04-30 ' do e cho $ file1 #run Auftrag mit $ Datei $ Datei1 Echo "Job erledigt" erledigt erledigt' – NewToUnix