Como usar dinamicamente variáveis dentro de um loop

0

Obtendo erro ao executar abaixo no Unix: eu quero que a terceira linha funcione ... No shell do ksh

while [ ${i} -le 3 ]
do
     var${i}="hello${i}"
     echo "${var}${i}"
     i='expr ${i} + 1'
done

Eu quero ter uma saída como abaixo,

hello1
hello2
    
por Gvtha 13.09.2017 / 13:29

2 respostas

3

No POSIX sh , você precisaria de eval para usar variáveis com nomes dinâmicos.

i=0
while [ "$i" -le 3 ]
do
   eval '
     var'"$i"'="hello${i}"
     echo "var$i = ${var'"$i"'}"
   '
   i=$((i+1))
done
echo "${var1}"

Ao usar eval , é essencial garantir que apenas as variáveis que precisam ser expandidas sejam expandidas no argumento passado para eval (e que seu valor seja limpo (aqui sabemos que são sequências seguras de decimal) dígitos)).

Acima apenas dois dos $i são expandidos. Para fazer isso, saímos das citações simples (strongs) e inserimos as aspas duplas $i : eval '...'"$i"'...' .

Como é difícil obter a cotação correta (e é perigoso se você não o fizer), é melhor limitar o máximo possível o eval . Idealmente apenas para transferir o conteúdo da variável dinâmica para uma estática e / ou vice-versa, como:

i=0
while [ "$i" -le 3 ]
do
   var=hello$i # $var with static name
   eval "var$i=\$var" # transfer into variable with dynamic name

   echo "var$i = $var" # use var with static name instead of dynamic one
                       # everywhere else (for which we don't need eval)

   i=$((i+1))
done
echo "${var2}"

Em ksh / zsh / bash / yash , talvez você queira usar matrizes (ou matrizes associativas em ksh93 , zsh ou versões recentes de bash ). Observe que os índices de matriz ksh / bash começam em 0 e os arrays são esparsos (mais como matrizes associativas com chaves limitadas a inteiros positivos) enquanto em todos os outros shells (incluindo zsh e yash no Bourne- como frente), os índices começam em 1 e os arrays são normais.

Em ksh / bash / zsh -o ksharrays :

unset -v var
i=0; while [ "$i" -le 3 ]; do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
  i=$((i+1))
done
echo "${var[1]}"

Ou usando outra extensão ((...)) da sintaxe% POSI sh comum a ksh / zsh / bash :

unset -v var
i=0; while ((i <= 3)); do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
  ((++i))
done
echo "${var[2]}"

Ou com ksh93 , bash , zsh -o ksharrays :

unset -v var
for ((i = 0; i <= 3; i++)); do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
done
echo "${var[3]}"
    
por 13.09.2017 / 13:45
0

Isso é muito mais fácil com um for loop:

for i in 1 2 3; do
  echo var$i\ =\ hello$i
done

Testado em bash .

    
por 13.09.2017 / 13:39

Tags