これが私が達成したいものです:
機能:
Func1() {
$1="Hello World"
}
通話機能:
local var1
Func1 var1
echo $var1 (should echo Hello World)
うまくいくような次の例を見つけましたが、evalを使うのは良い考えではないようです。
Func1() {
eval $1=$str1
}
これを行う正しい方法は何ですか?
私は.Net出身で、しばしばパラメータを参照として使用します。たとえば、後で使用するためにパラメータに値を再割り当てします。
上記の例では、var1に「Hello World」を割り当てる必要があります。
(私はshシェルを使用しています)
ベストアンサー1
eval
正しく使えば大丈夫です。
Func1() {
eval "$1=\$str1"
}
渡したい変数名のみを使用して呼び出す限りFunc1
安全です。
いつものように、変数を引用する必要があります。そしてここでは$str1
に渡す前に拡張は必要ありませんeval
。
ユーザーが制御できない任意の文字列を渡すことが可能な場合は、Func1
値と同様の問題があるため、次のreboot;foo
ように整理する必要があります。
Func1() {
case $1 in
"" |\
*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
[0123456789]* |\
BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
echo >&2 "Can't set that variable"
return 1
esac
eval "$1=\$str1"
}
完全なリストを作成問題があるしかし、変数は運命的な仕事です。