오늘은 큰 질문이 있어요! 나는 내 상황을 설명하기 위해 작은 예를 들었습니다.
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}}
$FOO
x[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)