변수 이름으로 환경 변수를 가져오시겠습니까? [복사]

변수 이름으로 환경 변수를 가져오시겠습니까? [복사]

예를 들어 변수가 있습니다.

env_name="GOPATH"

이제 다음과 같은 환경 변수를 얻고 싶습니다 GOPATH.

echo $GOPATH

이 문제를 어떻게 $GOPATH해결 하나요 $env_name?

답변1

이를 수행하기 위해 다른 쉘에는 다른 구문이 있습니다.

에서는 bash다음을 사용합니다.가변 간접:

printf '%s\n' "${!env_name}"

에서는 aka를 ksh사용합니다 .namereftypeset -n

nameref env_name=GOPATH
printf '%s\n' "$env_name"

에서는 zsh다음을 사용합니다.P 매개변수 확장 플래그:

print -rl -- ${(P)env_name}

다른 쉘에서는 사용해야합니다평가하다, 변수 내용이 안전한지 확실하지 않은 경우 여러 가지 보안 위험이 있습니다.

eval "echo \"\$$name_ref\""

답변2

eval쉘의 프롬프트 확장이 간접 참조를 처리하도록 하면 이 문제를 피할 수 있습니다.

PS1=\$$env_name sh -si </dev/null 2>&1

여기에는 몇 가지 장점이 있습니다. 특히 확장 후 명령을 실행하지 않습니다. 따라서 여기서 유일한 위험은 $env_name명령 대체가 포함되는 경우입니다. 확장되는 변수에는 확장이 세 번 시도되지 않고 두 번만 시도되므로 위험 없이 명령 대체처럼 보일 수 있는 모든 것이 포함될 수 있습니다. 이 방법으로 확인하는 것은 매우 쉽습니다.

PS1=$"${env_name##*[\'\(]*}" sh -si </dev/null 2>&1

POSIX를 고려하면 sh내보낸 환경 변수를 계속 인쇄하면서 임의 코드 실행 위험 없이 매우 안전해야 합니다.(쉘이 이해하는 유형)표준 출력으로.

관련 정보