ksh 脚本中的 eval 命令函数在我不希望它时通配



考虑以下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 "$queryn"
eval $3="${query}"
eval $4=$numfiles 
return 0
}
makeSQL $PROCESS_TYP $PROCESS_DT qry num_files
printf "QUERY: $qryn"
printf "NUMFILES: $num_filesn"

在上面的代码中,eval $3="${query}" 语句永远无法正常工作。 在所有情况下,它似乎都试图在"本地查询="中清除"*"......陈述。

./myquery.ksh ABC 2011-01-01

它总是返回如下消息:

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

我很确定这是我自己的用户错误,在这种情况下我如何应用 eval 但已经尝试了几乎所有替代语法结构来执行 eval $3 分配,但无法做到这一点。

我将其标记为 bash 是因为我很确定它在那里的行为也相同......

你的意思是:

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"

但是我建议的第一种形式对我来说似乎是最简单的。

相关内容

最新更新