将变量从 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
我有一个 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