使用嵌套 var 代替 var

使用嵌套 var 代替 var

我今天有一个大问题!我举了一个小例子来说明我的情况。

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)

相关内容