2016-10-21 63 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

我意识到你提供的解决方案并不能真正满足这个条件。也许我没有提供正确的用例。我编辑了我的问题。你能帮我解决这个问题吗?谢谢! –