考虑以下ksh脚本“myquery.ksh”
#/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 =“$ {query}”语句永远不能正常工作。在所有情况下,似乎都试图在“local query =”...语句中对“*”进行全局化。
./myquery.ksh ABC 2011-01-01
它总是返回如下消息:
./myquery.ksh: line 17: \*: command not found
我很确定这是我自己的用户错误,我在这种情况下如何应用eval但是已经尝试了几乎所有的替代语法结构来进行eval $ 3分配,但无法设法使其工作。
我已将此标记为bash,因为我很确定它的行为也会相同...
答案 0 :(得分: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"
但我建议的第一种形式对我来说似乎最简单。