como passar um valor para uma variável que em outra variável [duplicada]

0

Estou recebendo um erro de "substituição ruim" durante a execução deste código. Quero imprimir os valores em h_1 , h_2 , h_3 com um loop for .

#/!/bin/bash
h_1=12
h_2=13
h_3=14
for ((i=1; i<=2; i++))
 do
  echo "${h_$i}"
done
    
por shiva 22.08.2014 / 06:41

2 respostas

4

Você precisa usar expansão de parâmetro indireta com ! :

tmp=h_$i
echo "${!tmp}

Você tem que fazer a variável tmp extra aqui - você não pode simplesmente usar uma string, infelizmente. A expansão indireta funciona da seguinte forma:

If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself. This is known as indirect expansion.

Portanto, acima, ${!tmp} expande para o valor da variável cujo nome é dado pelo valor da variável tmp .

Também é possível usar eval aqui, mas a indireção a abordagem é mais organizada.

    
por 22.08.2014 / 06:52
1

Eu usaria o formato de parênteses duplos, o chamado Arithmetic Expansion :

echo $((h_$i))

Não há necessidade de matrizes, variáveis temporárias ou outras coisas extravagantes. Além disso, acredito que esta forma é mais portátil (a expansão aritmética é requerida pelo POSIX, tanto quanto eu sei).

Do manual de bash:

Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:

          $((expression))

The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially. All tokens in the expression undergo parameter expansion, string expansion, command substitution, and quote removal. Arithmetic expansions may be nested.

    
por 23.08.2014 / 00:39

Tags