将变量从shell脚本传递到BTEQ文件

时间:2016-10-21 03:07:03

标签: linux shell sh teradata ksh

我有一个shell脚本(.ksh),我在其中调用BTEQ文件来执行SQL查询。但是,执行BTEQ文件的日期取决于shell脚本中另一个SQL查询检查的数据可用性。

我想要的是什么:我想通过'日期'从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脚本中执行查询。 / p>

EDITED

我想要的是什么:我希望有一个变量RUNDATE(包含DATE值),并希望在每个地方都使用该变量。 RUNDATE的值应该在shell脚本的开头分配,基本上,它应该只读一次,并且在整个批处理过程中应该保持相同,即如果进程正在运行,即使新的一天也不会改变。

我可以使用

在shell脚本中阅读+1天
RUNDATE=`date +"%Y-%m-%d" -d "+1 day"`

现在我在shell脚本中运行两个批处理进程run_data_check和run_batch,我将把这个日期传递给BTQ文件。 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直到批处理完成。

我可以用任何方式解决这个问题。

2 个答案:

答案 0 :(得分:1)

看起来你真的在寻找这里的文件。

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

这可以避免讨厌的外部文件,并且巧合地删除了这个笨拙的useless use of cat

如果您希望日期在计算完毕后保持不变(如果脚本在午夜过后它不会在下面发生变化),

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

bteq运行之前,shell将评估here文档中的任何变量或通配符(只要你不引用here-document分隔符);这就是为什么星号必须被反斜杠转义的原因(否则shell会将glob扩展为当前目录中所有文件的列表)。

顺便说一下,你应该为自己的变量避免大写,因为大写是为系统使用而保留的。

当然可以使用sed完成相同的操作 - 只需确保不要使用单引号,因为这会阻止shell查看和修改变量。

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

答案 1 :(得分: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"