2016-10-21 64 views
1

我有一個shell腳本(.ksh),在其中我調用BTEQ文件來執行SQL查詢。但是,執行BTEQ文件的日期取決於shell腳本中另一個SQL查詢檢查的數據可用性。從shell腳本傳遞變量到BTEQ文件

我想要什麼:我想將'Date'變量從shell腳本傳遞到BTEQ文件中,以便執行的查詢將'date'考慮在內。

Shell腳本和check_data.ksh內的可變

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

BTEQ文件代碼(Sample_TD.btq)

sel * from test_table 
where cond = Rundate 

在上面的代碼中,我想 'Rundate' 來自check_data .ksh

我不想要的東西:實際上,我的查詢在3000行左右的代碼非常大,所以我不想執行查詢在shell腳本旁邊。

EDITED

我想要什麼:我想有一個變量RUNDATE(含DATE值),並希望使用該變量的每一個地方。 RUNDATE的值應該在shell腳本的開始處分配,基本上它應該只讀一次,並且應該在整個批處理過程中保持相同,即如果進程正在運行,即使新的一天到來也不應該改變。

我可以用

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

現在讀+1天shell腳本我運行兩個批處理進程run_data_check和run_batch中,我會通過這個日期到BTQ文件中的shell腳本里面。 Data_check是一個迭代過程,我不知道數據何時到來。因此,我希望固定日期以檢查當天的數據。

如果我使用

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

然後它不能幫助我的原因,因爲每次該功能運行時,它考慮的系統日期和相應地修改。我想要修復RUNDATE直到批處理完成。

任何我可以解決這個問題的方法。

回答

1

看起來您確實在尋找這裏的文檔。

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

這避免了討厭的外部文件,也不約而同地刪除的fugly useless use of cat

如果您想要的日期原地不動,一旦你計算出它(這樣,如果腳本不改變下過了午夜運行),

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

here文檔中的任何變量或通配符將前殼bteq運行進行評估(只要你不引用此文檔分隔符);這就是爲什麼星號必須反斜線(否則shell會將glob擴展到當前目錄中所有文件的列表)。

由此,你應該避免爲你自己的變量大寫,因爲大寫保留供系統使用。

當然也可以用sed做同樣的事情 - 只要確保不使用單引號,因爲那些引號會阻止shell查看和修改變量。

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

謝謝,@tripleee。我編輯了我的問題,更清楚地說明我的用例。你現在能告訴我我該怎麼做。 –

0

您只需更新腳本來改變關鍵字Rundate.btq文件中使用sed

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

sed命令將改變關鍵字Rundate的所有地方。您可能希望通過更嚴格的搜索來優化此示例:

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

謝謝,@oliv。它似乎適用於此。 只是想知道這將如何工作,當我必須發送多個參數一起在像Rundate,Var1,Var2這樣的Bteq文件參數/值。你能幫我解決嗎? –

+0

您需要擴展'sed'命令,例如's/var1/$ var1/g'。添加儘可能多的你想分隔的分號';'。 'var1'是查詢中的關鍵字,'$ var1'是保存該值的bash變量。 – oliv

+0

我意識到你提供的解決方案並不能真正滿足這個條件。也許我沒有提供正確的用例。我編輯了我的問題。你能幫我解決這個問題嗎?謝謝! –