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
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?
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
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.
Use uma matriz associativa . Não há boas razões para gerar nomes de variáveis como este.
Tags bash shell shell-script