2016-10-21 5 views
1

Ich habe ein Shell-Skript (. Ksh) innerhalb der ich die BTEQ-Datei zum Ausführen von SQL-Abfrage aufrufen. Das Datum der Ausführung der BTEQ-Datei hängt jedoch von der Datenverfügbarkeit ab, die eine andere SQL-Abfrage im Shell-Skript prüft.Übergabe von Variablen aus Shell-Skript zu BTEQ-Datei

Was ich will: Ich möchte 'Date' Variable aus Shell-Skript in die BTEQ-Datei übergeben, so dass die Abfrage, die ausführt, dieses 'Datum' berücksichtigt.

Shell-Skript und die Variable innerhalb des check_data.ksh

Rundate=`date +"%Y-%m-%d"` 
cat ~/.tdlogon_simba sample_TD.btq | bteq >> ${log_file} 2>&1 

BTEQ Datei Code (Sample_TD.btq)

sel * from test_table 
where cond = Rundate 

In dem obigen Code, ich will 'Rundate' von CHECK_DATA kommen .ksh

Was ich nicht wollen: In Wirklichkeit ist meine Abfrage sehr um 3000 Linie von Code, so dass ich die Abfrage nicht ausführen möchte ich nside das Shell-Skript.

EDITED

Was ich will: ich eine Variable RUNDATE (mit DATE-Wert) haben will, und will diese Variable in jedem Ort nutzen. Der Wert von RUNDATE sollte beim Start des Shell-Skripts zugewiesen werden, grundsätzlich sollte es nur einmal gelesen werden und sollte während des Batch-Prozesses gleich bleiben, d. H. Es sollte sich nicht ändern, auch wenn ein neuer Tag gekommen ist, wenn der Prozess läuft.

kann ich die 1 Tag in Shell-Skript lesen

RUNDATE=`date +"%Y-%m-%d" -d "+1 day"` 

mit Jetzt run_data_check und run_batch innerhalb des Shell-Skript Ich bin mit zwei Batch-Prozesse, in denen ich werde dieses Datum in die BTQ Datei werden vorbei . Data_check ist ein iterativer Prozess und ich weiß nicht, wann die Daten kommen. Daher möchte ich, dass das Datum festgelegt wird, um nach den Daten für diesen Tag zu suchen.

Wenn ich

verwenden
run_tdcheck 
sed "s/RUNDATE/$(date +'%Y-%m-%d' -d '+1 day')/g" ~/.tdlogon_simba test.btq | bteq >> ${log_file} 2>&1 

Dann ist es nicht meine Sache helfen, da jedes Mal diese Funktion läuft es das Systemdatum prüfen und entsprechend ändert. Ich möchte, dass RUNDATE repariert wird, bis die Stapelverarbeitung abgeschlossen ist.

Jeder Weg, mit dem ich dieses Problem lösen kann.

Antwort

1

Sieht aus wie Sie wirklich nach einem hier Dokument suchen.

bteq <<____HERE >>"$log_file" 2>&1 
    sel \* from test_table 
    where cond = $(date +"%F"); 
____HERE 

Dies vermeidet die lästige externe Datei, und entfernt auch zufällig die fugly useless use of cat

Wenn Sie das Datum gesetzt zu bleiben, wenn Sie es berechnet haben (so dass er das Skript nicht unter ändern, wenn läuft nach Mitternacht),

rundate=$(date +%F -d '+1 day') 
bteq <<____HERE >>"$log_file" 2>&1 
    sel \* from test_table 
    where cond = $rundate; 
____HERE 

Jede Variable oder Platzhalter in dem hier Dokument wird von dem Shell vor bteq läuft (so lange ausgewertet werden, da Sie die hier-Dokument Begrenzer zitieren); Aus diesem Grund muss das Sternchen Backslash-Escape sein (andernfalls würde die Shell den Glob auf eine Liste aller Dateien im aktuellen Verzeichnis erweitern).

By the, sollten Sie vermeiden, Großbuchstaben für Ihre eigenen Variablen, wie Großbuchstaben für die Systemnutzung reserviert ist.

Das Gleiche könnte natürlich auch mit sed gemacht werden - stellen Sie sicher, dass Sie keine einfachen Anführungszeichen verwenden, da diese verhindern, dass die Shell die Variable sieht und ändert.

sed "s/RUNDATE/$rundate/g" ~/.tdlogon_simba test.btq | 
bteq >> ${log_file} 2>&1 
+0

Danke, @tripleee. Ich habe meine Frage bearbeitet, um meinen Anwendungsfall deutlicher zu machen. Können Sie mir jetzt raten, wie ich vorgehen soll? –

0

Sie können einfach Ihr Skript aktualisieren das Stichwort Rundate in Ihrer .btq Datei sed mit ändern:

rundate="$(date -d '+1 day' +%Y-%m-%d)" 
sed "s/Rundate/$rundate/g" ~/.tdlogon_simba sample_TD.btq | bteq >> ${log_file} 2>&1 

Der sed Befehl alle Vorkommen ändern des Rundate Schlüsselwort. Vielleicht möchten Sie dies verfeinern, indem Sie eine restriktivere Suche für zB:

sed "s/cond = Rundate/cond = $rundate/g" 
+0

Danke, @oliv. Es scheint damit gut zu gehen. Fragen nur, wie dies funktioniert, wenn ich mehrere Argumente zusammen in der Bteq-Datei wie Rundate, Var1, Var2 wie Parameter/Werte senden müssen. Kannst du mir damit helfen. –

+0

Sie müssen den Befehl 'sed' erweitern, zum Beispiel 's/var1/$ var1/g'. Fügen Sie beliebig viele Punkte hinzu, die durch Semikolon ';' getrennt sind. Das 'var1' ist das Schlüsselwort in Ihrer Abfrage, das' $ var1' ist die Bash-Variable, die den Wert enthält. – oliv

+0

Ich erkannte, dass die Lösung, die Sie gaben, die Bedingung nicht wirklich erfüllte. Vielleicht habe ich nicht den richtigen Anwendungsfall angegeben. Ich habe meine Frage bearbeitet. Können Sie mir helfen, dieses Problem zu lösen? Vielen Dank! –

Verwandte Themen