Combinando um valor de variável e string para formar outra variável

0

Eu quero referenciar uma variável bash de uma variável sem usar:

echo "${!VARNAME}"

Alguma ideia? Como eu quero usar a variável na mosca e muitas dessas referências estão lá, eu não posso declará-las para outra variável e usá-las.

Exemplo:

var1=host
${var1}_file ----> host_file is another variable that i want to call in a command. 
    
por Rajesh Reddy B 18.02.2018 / 22:43

4 respostas

1

var1=host
eval "${var1}_file='Test for words'"

$ echo $host_file
Test for words
    
por 19.02.2018 / 07:45
0

De acordo com a resposta anterior, você pode usar o eval para isso.

eval [arg ...] The args are read and concatenated together into a single com‐ mand. This command is then read and executed by the shell, and its exit status is returned as the value of eval. If there are no args, or only null arguments, eval returns 0. (from bash man page)

No entanto, esse é um daqueles maus hábitos de programação que você precisa estar ciente e usar o mínimo possível. Normalmente pode ser evitado por algo mais elegante, menos propenso a erros e mais fácil de depurar.

var1=host
eval echo ${var1}_file # print contents of $host_file
    
por 19.02.2018 / 10:19
0

Não consigo ver por que você não gostaria de usar a indirecção de variáveis, a menos que esteja escrevendo um script sh (não bash ).

Como foi mencionado, eval funcionará, mas geralmente é desaprovado, pois seu uso tem o potencial de ser perigoso, especialmente ao avaliar dados fornecidos pelo usuário sem saneamento cuidadoso.

Outra maneira de obter o mesmo efeito é usar variáveis de referência de nomes (disponíveis em bash desde a versão 4.3).

var1=host

declare -n nameref="${var1}_file"

nameref="something something"

printf '%s\n' "$host_file"

Isso produziria a string something something . Usar typeset -n no lugar de declare -n faria com que funcionasse em bash e em ksh93 .

    
por 19.02.2018 / 10:29
0

Se você tiver variáveis nomeadas como uma combinação de algum nome próprio e atributos relacionados, provavelmente você deve usar matrizes associativas. Supondo que você tenha Bash 4.x, ksh ou zsh, isto é. Veja uma página ou outro no BashGuide. (Na verdade estruturas como em C seriam legais, mas você não pode realmente entender isso com o Bash.)

Ou seja, para armazenar um URL e uma porta para os hosts / clusters oregon e arizona , não faça quatro variáveis arizona_url , arizona_port , oregon_url , oregon_port , mas sim algo assim:

typeset -A urls ports
urls[oregon]="http://..."
urls[arizona]="http://..."
ports[oregon]=1234
ports[arizona]=2345

e depois usá-los com "${urls[$hostname1]}" , "${ports[$hostname]}" etc.

    
por 19.02.2018 / 10:57