Como fazer avaliação de variável indireta

7

Estou tentando imprimir um valor simples para $ AR1_p1, mas a variável $ i não está avaliando.

for i in 1 2 3 4
do
AR1_p1=22
AR1_p2=23
AR1_p3=24
AR1_p3=25
echo $AR1_p$i
done 

É como concatenar dinamicamente. Alguma sugestão sobre como corrigir isso?.

    
por serverliving.com 12.01.2016 / 14:47

5 respostas

6

Esse loop funciona. Use Arrays.

$ for i in 1 2 3 4; do AR1_p1=22; AR1_p2=23; AR1_p3=24; AR1_p4=25; echo $((AR1_p$i)); done 
22
23
24
25
    
por 12.01.2016 / 14:56
23

Você pode usar referências indiretas bash para isso:

AR1_p1=22
AR1_p2=23
AR1_p3=24
AR1_p4=25
for i in 1 2 3 4
do
  VARNAME="AR1_p${i}"
  echo "${!VARNAME}"
done
    
por 12.01.2016 / 14:59
7

Por comentário (s) sugerido, o array deve ser usado:

#!/bin/bash

AR1_p=(22 23 24 25)

for i in {1..4}
do
  echo "${AR1_p[$i-1]}"
done
    
por 12.01.2016 / 14:55
3

Use eval:

#!/bin/bash

AR1_p1=22
AR1_p2=23
AR1_p3=24
AR1_p4=24
for i in 1 2 3 4
do
    eval echo \$AR1_p$i
done

echo expande apenas $ i. Quando esta expressão atinge eval, é como: $ AR1_p1. Eval tenta avaliar e dá o resultado.

    
por 12.01.2016 / 14:53
1

POSIXly:

for i in 1 2 3 4
do  AR1_p1=22
    AR1_p2=23
    AR1_p3=24
    AR1_p4=25
    echo "$((AR1_p$i))"
done

Um pouco menos confuso, talvez:

for i in 1 2 3 4
do  echo "$((AR1_p$i=i+21))"
done

Ainda POSIXly, mas muito mais sensato:

i=0 n=21 l=4
while  [ "$l" -ge "$((i+=1))" ]
do     echo "$((AR1_p$i=i+n))"
done
    
por 21.01.2016 / 00:58

Tags