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

标签 linux shell sh teradata ksh

我有一个 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 day
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。

任何我能解决这个问题的方法。

最佳答案

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

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/

相关文章:

c - 在不复制实例的情况下多次执行程序

c++ - 如何删除文件夹中的所有文件,但不使用 NIX 标准库删除文件夹?

bash - 如何将由不同分隔符分隔的两个不同列提取到同一行中

shell - 使用 SIGTSTP 挂起子进程后,shell 没有响应

linux - 如何在 Linux POSIX shell 脚本中捕获 CTRL+Z;可能与否?

shell - 如何在 shell 函数中获得 "set -e"的效果和用处?

shell - 在 ksh 中执行最后一个命令

linux - 命令运行时如何简化输出文件

linux - 使用 awk 删除重复行并仅打印文件中的最新行

shell - 如何将在 emacs *shell* 缓冲区内运行的进程更改为后台