【问题标题】:eval command function within ksh script is globbing when I don't want it to当我不希望它时,ksh 脚本中的 eval 命令函数是 globbing
【发布时间】:2012-03-13 22:03:49
【问题描述】:

考虑以下 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,因为我很确定它在那里的行为也会相同...

【问题讨论】:

    标签: bash eval ksh evaluation expression-evaluation


    【解决方案1】:

    你的意思是:

    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"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多