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

Passing variables from shell script to BTEQ File

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

我想要什么: 我想将 shell 脚本中的 'Date' 变量传递到 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 脚本.

已编辑

我想要什么:我想要一个变量 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。

有什么方法可以解决这个问题。

您可以简单地更新脚本以使用 sed 更改 .btq 文件中的关键字 Rundate :

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"

看来您真的是在寻找此处的文档。

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

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

顺便说一下,您应该避免为自己的变量使用大写字母,因为大写字母保留供系统使用。

当然,sed 也可以这样做——只要确保您不使用单引号,因为单引号会阻止 shell 查看和修改变量。

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