Функция команды eval в сценарии ksh выдает сообщение, когда я этого не хочу - PullRequest
1 голос
/ 14 марта 2012

Рассмотрим следующий скрипт 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, потому что я вполне уверен, что и там он будет вести себя одинаково ...

1 Ответ

3 голосов
/ 14 марта 2012

Возможно, вы имели в виду:

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"

Но первая предложенная мной форма кажется мне самой простой.

...