Como faço referência ao valor de uma variável de ambiente construída em um loop?

2

O que eu estou tentando fazer é fazer um loop sobre variáveis de ambiente. Eu tenho um número de instalações que mudam e cada instalação tem 3 IPs para enviar arquivos e executar scripts, e eu quero automatizar isso tanto quanto possível (para que eu tenha apenas que modificar um arquivo que eu vou buscar com o variáveis ambientais). A seguir, uma versão simplificada que, depois de descobrir, posso resolver meu problema.

Então, em my.props:

COUNT=2
A_0=foo
B_0=bar
A_1=fizz
B_1=buzz

Eu quero preencher o loop for no seguinte script

#!/bin/bash
. <path>/my.props

for ((i=0; i < COUNT; i++))
do
  <script here>
done

Para que eu possa obter os valores das variáveis de ambiente. Como o seguinte (mas isso realmente funciona):

echo $A_$i $B_$i

ou

A=A_$i
B=B_$i
echo $A $B

retorna foo bar e depois faz buzz

    
por Rob Spieldenner 19.04.2010 / 18:49

4 respostas

2
$ num=0
$ declare A_$num=42  # create A_0 and set it to 42
$ echo $A_0
42
$ b=A_$num           # create a variable with the contents "A_0"
$ echo ${!b}         # indirection
42

Você pode iterar num e usar declare para criar as variáveis e a indireção para referenciá-las. Mas você não prefere usar matrizes?

for i in foo bar baz
do
    some_array+=($i)    # concatenate values onto the array
done

ou

string="foo bar baz"
some_array=($string)

Que tal isso?

$ cat IPs
192.168.0.1
192.168.0.2
192.168.0.3
$ cat readips
#!/bin/bash
while read -r ip
do
    IP[count++]=ip                 # is it necessary to save them in an array,
    do_something_directly_with ip  # if you use them right away?
done < IPs
    
por 19.04.2010 / 19:09
1
A='eval echo \$A_$i'
    
por 19.04.2010 / 18:58
1

A resposta foi encontrada em Referências indiretas, capítulo do guia avançado de script Bash

Eu precisava fazer

eval A=\$A_$i
eval B=\$B_$i
    
por 19.04.2010 / 19:27
0

Não tenho certeza se estou seguindo totalmente a sua pergunta, mas se você quiser que as variáveis disponíveis para os scripts filhos, use o export integrado:

kbrandt@kbrandt:~/scrap$ help export
export: export [-nf] [name[=value] ...] or export -p
    NAMEs are marked for automatic export to the environment of
    subsequently executed commands.

Pelo que eu acho que você pode tentar, eu colocaria os IPs em um arquivo, um IP por linha. Então, o script de instalação lê o ip como um argumento de linha de comando:

while read ip; do
   ./install-script "$ip"
done < file_with_ips

Se houver mais de um dado por registro, você poderá deliminá-los:

kbrandt@kbrandt:~/scrap$ cat file_with_data 
192.168.2.5:foobar:baz
kbrandt@kbrandt:~/scrap$ while IFS=":" read -r ip data1 data2; do 
> echo "$ip@$data1@$data2"
> done < file_with_data
192.168.2.5@foobar@baz
    
por 19.04.2010 / 18:55

Tags