関数の戻り値を独自のパラメータの1つに格納する

関数の戻り値を独自のパラメータの1つに格納する

これが私が達成したいものです:

機能:

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"
}

完全なリストを作成問題があるしかし、変数は運命的な仕事です。

おすすめ記事