1

次の 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としてタグ付けしました...

4

1 に答える 1

3

もしかして:

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

説明:あなたの例では、変数名を関数に渡したいと思っています。これらの変数は設定されています。したがって、ステートメントは次のようになります。

qry=$query
num_files=$numfiles

問題は、これらの文字列をどのように組み合わせるかです。左辺は、たとえば"$3". 右辺には a が含まれており、早すぎると解釈$してはなりません。したがって、私はそれを書いた\$

eval最も信頼できる結果が得られるので、私は常に単一の文字列をコマンドに渡します。ではなくeval echo fooeval "echo foo"代わりに。

あるいは、次のように書くこともできます:

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

しかし、私が提案した最初の形式は、私には最も単純に思えます。

于 2012-03-13T22:13:16.003 に答える