2015-09-30 89 views
2

我试图从shell脚本运行我的过程。问题是参数不被过程读取将shell变量传递给plsql过程

#! /bin/bash 

circle="GENX" 
Date="2015/09/29" 
version="V2" 

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/[email protected] <<"EOF" 
begin 
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version'); 
commit; 
end; 
/
"EOF" 

回答

1

它不喜欢被引用的heredoc限制字符串;我可以复制并删除引号修复它:

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/[email protected] <<EOF 
begin 
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version'); 
commit; 
end; 
/
EOF 

这与Oracle无关,它是shell和heredoc的工作方式;这样的:

cat <<"EOF" 
$circle 
"EOF" 

...打印$circle代替GENX了。

This is known behaviour

引用或逃避“限价串”在这里文件的头部禁用其体内参数替换。原因是引用/转义限制字符串有效地转义了$,`和\特殊字符,并且使它们被字面解释。

0

您需要使用未加引号的EOF进行参数扩展。由于bash reference用于重定向:

这种类型的重定向指示壳读取来自电流源的输入,直到仅包含字(没有尾随空格)的线能够被看见。所有读到该点的行都被用作命令的标准输入。

这里的文档的格式是:

<<[-]word 
    here-document 
    delimiter 

无参数和变量扩展,命令替换算术扩展或文件名扩展是在字执行。如果引用了单词中的任何字符,则分隔符是对单词的引用删除的结果,并且此文档中的行不会展开。如果单词不加引号,则这里的文档的所有行都经过参数扩展,命令替换和算术扩展,忽略字符序列\换行符,并且'\'必须用于引用字符'\','$ '和'`'。

所以,你必须让(你的情况EOF)这个词在bash脚本未加引号,使其工作:

#! /bin/bash 

circle="GENX" 
Date="2015/09/29" 
version="V2" 

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/[email protected] <<EOF 
begin 
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version'); 
commit; 
end; 
/
EOF