obtém a variável de ambiente pelo nome da variável? [duplicado]

31

Por exemplo, eu tenho uma variável:

env_name="GOPATH"

Agora eu quero pegar a variável de ambiente GOPATH como se fosse assim:

echo $GOPATH

Como posso obter $GOPATH por $env_name ?

    
por roger 28.12.2015 / 11:11

2 respostas

34

Diferentes shells possuem diferentes sintaxes para isso.

Em bash , você usa indireto de variável :

printf '%s\n' "${!env_name}"

Em ksh , você usa nameref aka typeset -n :

nameref env_name=GOPATH
printf '%s\n' "$env_name"

Em zsh , você usa P sinalizador de expansão de parâmetro :

print -rl -- ${(P)env_name}

Em outro shell, você deve usar eval , que coloca você sob muitas implicações de segurança se não estiver Certifique-se de que o conteúdo da variável é seguro:

eval "echo \"\$$name_ref\""
    
por 28.12.2015 / 11:27
-1

Você pode evitar eval se permitir que a expansão imediata de um shell manipule a indireção:

PS1=\$$env_name sh -si </dev/null 2>&1

Isso tem algumas vantagens - particularmente porque a expansão não é seguida pela execução do comando. E então o único perigo aqui é se $env_name contiver uma substituição de comando. A variável que ela expande pode conter qualquer coisa que possa parecer uma substituição de comando sem perigo, porque a expansão não é tentada três vezes - apenas duas vezes. Desta forma, a validação é bastante fácil:

PS1=$"${env_name##*[\'\(]*}" sh -si </dev/null 2>&1

Dado um POSIX sh , isso deve ser bastante seguro sem qualquer risco de execução arbitrária de código, enquanto ainda imprime qualquer variável de ambiente exportada (do tipo que um shell pode entender) para o padrão .

    
por 28.12.2015 / 21:25