2015-09-30 90 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