Use var aninhado para var substituto

1

Eu tenho uma grande pergunta hoje! Eu fiz um pequeno exemplo da minha situação.

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

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

Eu quero imprimir "final". Eu tentei todo tipo de coisas como $ {$ {! FOO @} BAR} (Eu sei que não está correto) e não encontrei nenhuma solução para o meu problema. Idealmente eu não quero passar via variável temporária / eval.

    
por Chuck Noxis 25.11.2016 / 15:23

3 respostas

0

Foi para passar argumentos para outra função, a melhor maneira que encontrei:

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}

Por esse motivo, não quis usar o temporário var ou eval. (Desculpe a responder 2 semanas depois).

    
por 09.12.2016 / 15:47
2

Terá de haver alguma avaliação de código em tempo de execução em qualquer caso

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

Ou sem o temporário var :

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

Se a sua preocupação é que $FOO pode conter outras coisas além do nome de uma variável (como foo=$(reboot) , que pode ter consequências negativas), você deve fazer o saneamento à mão antes:

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}\""

Com zsh , você poderia fazer:

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

mas você ainda deseja desinfetar o valor de $FOO se não for confiável, pois valores como x[0$(reboot)] ainda seriam um problema.

    
por 25.11.2016 / 15:54
-1

tente

var=${FOO}BAR
## to print
eval echo \$$var
## to set
somevar=$(eval echo \$$var)
    
por 25.11.2016 / 15:38