Essa sintaxe ((i=1;i<=3;i=i+1))
é ksh93 (agora também é suportada por bash
e zsh
(embora você precise de espaços em branco entre for
e ((
em zsh
)).
Em ksh93
e nas versões recentes de bash
(4.3, 2014 ou acima), você pode fazer:
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
typeset -n name="a$i"
printf '%s\n' "$name"
done
Em zsh
, você pode usar a sintaxe indireta de variável: ${(e)code}
(desde maio de 1996), ${(P)name}
(desde 1999)
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
name=a$i
printf '%s\n' "${(P)name}"
# or
code="\$a$i"
printf '%s\n' "${(e)code}"
# or combined:
printf '%s\n' "${(e):-\$a$i}" "${(P)${:-a$i}}"
done
bash
também adicionou seu próprio recurso de indireto de variável, mas usando uma sintaxe diferente (em 2.0 em dezembro de 1996), e uma que significa quase o oposto da do ksh93:
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
name=a$i
printf '%s\n' "${!name}"
done
Com qualquer shell POSIX, (incluindo mas não limitado a ksh93, bash ou zsh), você sempre pode fazer:
a1="one"
a2="two"
a3="three"
i=1; while [ "$i" -le 3 ]; do
name=a$i
eval "value=\${$name}"
printf '%s\n' "$value"
i=$((i + 1))
done