2011-03-11 69 views
0

我有一個UNIX腳本是這樣的:的Unix把多餘的空格/線,而將值傳遞給SQL語句

value1=`sqlplus -s ivr/ivr <<EOF 
set heading off; 
set feedback off; 
set linesize 500; 
set serveroutput on; 
set wrap off; 

SELECT FM.getSequence_n('$b_period', '$t_period', '$opr', '$fran', '$poi_s') 
    FROM DUAL; 

exit; 
EOF` , 

的參數作爲用戶輸入。當我運行使用「ksh的-x filename.sh」我注意到,當UNIX腳本將值傳遞給select語句它打破它像這樣在調試模式下運行腳本:

SELECT FM.getSequence_n(' 
     2010/12/01 - 2010/12/31',' 
     2010/12/01 - 2010/12/31','TTSLAP','UWAP','TTSL-LOC') 
    FROM DUAL 

...這給錯誤的輸出。當我運行同一個sql語句與傳遞的值在sqlplus中的所有值在一行中我得到正確的輸出。

我需要知道爲什麼UNIX是打破聲明成多行和這可怎麼去除。這一直給我做惡夢。首先,我認爲價值沒有被正確地傳遞,這就是爲什麼產出是錯誤的。但只有unix在傳遞值的時候換行是導致錯誤的原因。請幫忙。

回答

0

好像你$b_period$t_period變量包含換行符。如果他們直接從用戶輸入,你應該做一些input validation first before using them

嘗試像

filtered_b_period=`echo $b_period | sed 's/[^0-9\/]*//g'` 
filtered_t_period=`echo $t_period | sed 's/[^0-9\/]*//g'` 

也許你應該添加進一步檢查爲好,但至少你應該能夠過濾掉不需要的字符這樣。

+0

的B_PERIOD和t_period具有價值:「2010/12/01 - 2010/12/31」,現在,當我使用你所建議的方法,SQL查詢現在正處於單行參數僅但現在的問題是sed刪除' - '以及跟隨和跟蹤' - '的單個空間。我如何確保只有從開始不必要的空間被刪除,而不是這些?請建議。 – Pranay 2011-03-11 09:53:01

+0

使用's/^ [\ t] * //; s/[\ t] * $ //'去除尾隨和前導空格。感謝您提供sed。 – Pranay 2011-03-11 10:04:51

+0

抱歉,我的搜索模式存在疏漏。要包含'-'作爲一個不被刪除的有效字符,可以將它作爲'[[]]中的第一個或最後一個字符,例如'sed's/[^ - 0-9 \ /] * // g''。 – hlovdal 2011-03-11 12:27:41

0

變量的值包括換行符。做這樣的事情來檢查:

echo "$b_period" | hexdump -C