我有一个 shell 脚本 (.ksh),我在其中调用 BTEQ 文件来执行 SQL 查询。但是,执行 BTEQ 文件的日期取决于 shell 脚本中的另一个 SQL 查询检查的数据可用性。
我想要什么:我想将“日期”变量从 shell 脚本传递到 BTEQ 文件中,以便执行的查询考虑到该“日期”。
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 dayRUNDATE=`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。
任何我能解决这个问题的方法。
最佳答案
看来您真的是在寻找此处的文档。
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
关于linux - 将变量从 shell 脚本传递到 BTEQ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167713/