Bash - Como acessar uma variável com um sufixo numérico usando um loop FOR [duplicado]

0

Eu declarei var0, var1, var2, var3 com um loop for. Como faço para ecoar os vars dentro desse loop? Aqui está o código.

#!/bin/bash

for i in {0..3}
do
  export var$i=$i
done;

Eu defini var0, var1, var2, var3 .. como eu os acesso em um loop?

eu tentei o seguinte

for i in {0..3}
do
  echo $var$i
  tmpvar=var$i
  echo $tmpvar
done

mas nenhum me deu os valores de var0, var1 ... primeiro eco apenas impresso '0,1,2,3', segundo eco impresso 'var0, var1, var2, var3' o que eu faço? Eu quero os valores ..

    
por J. Doe 16.09.2018 / 18:57

2 respostas

4

Você pode usar o eval para isso:

$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done

Tome cuidado com as citações e fugindo. Se os valores contiverem espaços em branco ou caracteres glob, os três primeiros dividirão os valores no espaço em branco e, em seguida, expandirão todos os nomes de arquivos que correspondam ao glob. Isso pode ou não ser o que você quer. Por exemplo:

$ var1='<  x  >' var2='< * >'
$ for i in 1 2; do eval echo \$var$i; done
< x >
< [list of filenames in current directory] >

(Observe que os espaços duplos em torno de x foram reduzidos a espaços únicos, pois echo recebeu < , x e > como argumentos separados.)

Para contornar isso, você precisa garantir que a expansão da variável seja citada no eval , por exemplo:

$ for i in 1 2; do eval echo \"\$var"$i"\"; done
<  x  >
< * >

(cite o $i também, como acima, a menos que você saiba que IFS não contém nenhum dígito.)

    
por 16.09.2018 / 19:14
5

Dado,

var0=a
var1=b
var2=c

com ksh93 ou bash 4.3 ou mais recente, você pode usar um nameref para apontar para as variáveis individuais:

for i in 0 1 2; do
    typeset -n p="var$i"
    echo "$p"
done

Mas, a menos que você precise explicitamente das variáveis como escalares separados (por exemplo, porque você os passou pelo ambiente) e não estiver usando um shell estritamente padrão, mas Bash ou ksh, use uma matriz:

#!/bin/bash
a=(a b c)
for i in 0 1 2; do
    echo "${a[i]}"
done

Ou ignorando os índices:

for x in "${a[@]}"; do
    echo "$x"
done

(Zsh, é claro, tem arrays também, ele apenas inicia a indexação de 1 por padrão, então o primeiro não funciona diretamente.)

    
por 16.09.2018 / 19:03

Tags