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]}"