Shell, concatenando 2 strings para referenciar uma terceira variável

6

Estou tentando fazer o seguinte no meu script:

#/bin/bash -x
var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
   echo \$var$i
done

Obviamente, isso não funciona como esperado e resulta na seguinte saída:

$var1
$var2
$var3
$var4

Como posso referenciar dinamicamente as variáveis no meu loop?

    
por Hugo 31.07.2013 / 09:35

4 respostas

11

Você está procurando por isso?

$ cat indirection.bash
#!/bin/bash -x

var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
        s="var${i}"
        echo "${!s}"
done

$ ./indirection.bash
www
www2
www3
www4
    
por 31.07.2013 / 10:12
7

Você pode usar uma matriz:

#/bin/bash -x

declare -a vars=(
    www
    www2
    www3
    www4
)

for var in "${vars[@]}"; do
   echo "$var"
done

Ou iterar com índice:

for i in "${!vars[@]}"; do
    echo "${vars[$i]}"
done
    
por 31.07.2013 / 10:19
3

Normalmente, o shell expande a variável apenas uma vez. Você pode usar indiretamente expandir ou pedir shell para expandi-lo mais uma vez, por exemplo:

eval "val=\$var$i"; echo "$val";

em vez de apenas:

echo "\$var$i"

Este método é muito portátil, mas usa evil eval .

Usando a expansão indireta como mostrado em outras respostas (consulte Expansão de parâmetro em homem bash ) ${!VAR_NAME} é uma boa solução, quando a portabilidade não é necessária e você tem permissão para usar extensões BASH.

    
por 31.07.2013 / 14:04
2

Use uma matriz associativa . Não há boas razões para gerar nomes de variáveis como este.

    
por 31.07.2013 / 14:14