2012-03-13 90 views
1

考慮下面的ksh腳本「myquery.ksh」eval命令功能通配符時,我不希望它

#/usr/bin/env ksh -eu 

PROCESS_TYP=$1 
PROCESS_DT=$2 

#Generate a query 
makeSQL() 
{ 
local numfiles=0 
local query='SEL \\* FROM TABLE_1_' 
case "$1" in 
'ABC') query="${query}ABC" ; numfiles=1 ;; 
'DEF') query="${query}DEF" ; numfiles=7 ;; 
esac 
query="${query}_V WHERE LOAD_DT='${2}';" 
printf "$query\n" 
eval $3="${query}" 
eval $4=$numfiles 
return 0 
} 

makeSQL $PROCESS_TYP $PROCESS_DT qry num_files 

printf "QUERY: $qry\n" 
printf "NUMFILES: $num_files\n" 

在上面的代碼中,eval $ 3 =「$ {查詢} 「聲明從不正確工作。在所有情況下,它似乎試圖在「本地查詢=」...語句中將「*」進行整數化。

./myquery.ksh ABC 2011-01-01 

它總是返回這樣的信息:

./myquery.ksh: line 17: \*: command not found 

我敢肯定這是我如何在這種情況下應用的eval但已經試過幾乎所有的替代語法構造我自己的用戶錯誤做這個評估3美元的任務,但無法完成這項工作。

,因爲我敢肯定它也將表現相同那裏還有我已標記這是慶典...

回答

3

你的意思是:

eval "$3=\$query" 
eval "$4=\$numfiles" 

說明:在您的例子中,你想傳遞函數的變量名稱,然後設置這些變量。所以這些陳述應該是這樣的:

qry=$query 
num_files=$numfiles 

現在的問題是如何把這些字符串放在一起。左側來自參數,例如"$3"。右側包含$必須而不是被解釋得太早。所以我把它寫成\$

我總是將一個字符串傳遞給eval命令,因爲這給了我最可靠的結果。不是eval echo foo,而是eval "echo foo"

或者你可以這樣寫:

eval "$3"='$query' 
eval "$3="'$'"query" 

但我認爲第一種形式似乎最簡單的給我。

+0

太棒了,工作。但爲什麼? :) – user1267616 2012-03-13 22:38:22

+0

我添加了一個解釋。 – 2012-03-14 08:24:54

相關問題