我正在尝试从shell脚本运行我的过程。问题是程序无法读取参数
#! /bin/bash
circle="GENX"
Date="2015/09/29"
version="V2"
/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<"EOF"
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
"EOF"
答案 0 :(得分:1)
它不像引用的heredoc限制字符串;我可以重现并删除引号修复它:
/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<EOF
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
EOF
这与Oracle无关,它与shell和heredoc的工作方式有关;这样:
cat <<"EOF"
$circle
"EOF"
...也打印$circle
而不是GENX
。
引用或转义&#34;限制字符串&#34;在here文档的头部禁用其体内的参数替换。这样做的原因是引用/转义限制字符串有效地转义$,`和\ special字符,并使它们按字面解释。
答案 1 :(得分:0)
您需要使用不带引号的EOF
进行参数扩展。由于bash reference重定向:
这种类型的重定向指示shell从当前源读取输入,直到看到只包含单词(没有尾随空白)的行。然后,读取到该点的所有行都将用作命令的标准输入。
here-documents的格式为:
<<[-]word
here-document
delimiter
不对字执行参数和变量扩展,命令替换,算术扩展或文件名扩展。如果引用单词中的任何字符,则分隔符是单词上的引号删除的结果,并且不会展开here-document中的行。如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,字符序列\ newline将被忽略,'\'必须用于引用字符'\','$ '和'''。
所以,你必须在bash脚本中单词(EOF
在你的情况下)不加引号,以使它工作:
#! /bin/bash
circle="GENX"
Date="2015/09/29"
version="V2"
/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<EOF
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
EOF