var 대신 중첩된 var 사용

var 대신 중첩된 var 사용

오늘은 큰 질문이 있어요! 나는 내 상황을 설명하기 위해 작은 예를 들었습니다.

FOO="foo";
fooBAR="final";

var=${${FOO}BAR}
echo $var

"최종"을 인쇄하고 싶습니다. ${${!FOO@}BAR}(잘못된 것으로 알고 있음)과 같은 다양한 방법을 시도했지만 문제에 대한 해결책을 찾지 못했습니다. 이상적으로는 임시 변수/평가를 통해 전달하고 싶지 않습니다.

답변1

그럼에도 불구하고 일부 런타임 코드 평가를 수행해야 합니다.

eval "var=\${${FOO}BAR}"
printf '%s\n' "$var"

또는 임시 없이 var:

eval "printf '%s\n' \"\${${FOO}BAR}\""

$FOO변수 이름 이외의 다른 항목이 포함될 수 있다는 우려가 있는 경우 (예: foo=$(reboot)바람직하지 않은 결과가 발생할 수 있음) 먼저 수동으로 정리해야 합니다. 예를 들면 다음과 같습니다.

valid_variable() {
  local LC_ALL=C
  case $1 in
    ("" | *[![:alnum:]]* | [0-9]*) return 1
  esac
}

valid_variable "${FOO}BAR" || exit 1
eval "printf '%s\n' \"\${${FOO}BAR}\""

이를 통해 zsh다음을 수행할 수 있습니다.

printf '%s\n' ${(P):-${FOO}BAR}}

$FOOx[0$(reboot)]그러나 신뢰할 수 없는 경우에도 여전히 문제가 될 수 있으므로 해당 값을 삭제해야 합니다 .

답변2

이는 다른 함수에 인수를 전달하기 위한 것이며 이것이 제가 찾은 가장 좋은 방법입니다.

local CLIENT_URL="${CLIENT}_URL"
local CLIENT_FOLDER="${CLIENT}_FOLDER"
local CLIENT_BIN_PATH="${CLIENT}_BIN_PATH"
installClient   ${UPDATE_OS_PACKAGES}\
                ${USER_NAME}\
                ${GROUP_NAME}\
                ${!CLIENT_URL}\
                ${!CLIENT_FOLDER}\
                ${!CLIENT_BIN_PATH}

이러한 이유로 임시 var 또는 eval을 사용하고 싶지 않습니다. (답변하는데 2주가 걸려서 죄송합니다.)

답변3

노력하다

var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)

관련 정보