이것이 내가 달성하고 싶은 것입니다:
기능:
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"
}
전체 목록을 작성하세요문제가 있는그러나 변수는 운명적인 작업입니다.