我今天有一个大问题!我举了一个小例子来说明我的情况。
FOO="foo";
fooBAR="final";
var=${${FOO}BAR}
echo $var
我想打印“最终”。我尝试了诸如 ${${!FOO@}BAR} 之类的各种方法(我知道这是不正确的),但没有找到任何解决我的问题的方法。理想情况下,我不想通过临时变量/eval 传递。
答案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。 (抱歉两周后才回复。)
答案3
尝试
var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)