함수의 반환 값을 자체 매개변수 중 하나에 저장

함수의 반환 값을 자체 매개변수 중 하나에 저장

이것이 내가 달성하고 싶은 것입니다:

기능:

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

전체 목록을 작성하세요문제가 있는그러나 변수는 운명적인 작업입니다.

관련 정보