bash
4.3 adicionou suporte para ksh93
-like namerefs.
Então, no bash-4.3 ou acima, você pode fazer:
a0[5]=whatever
x=0
typeset -n var="a$x"
printf '%s\n' "${var[5]}"
Mas note que é uma referência (um ponteiro, não uma cópia) para a variável nome , não a variável (a diferença é importante quando você tem várias variáveis pelo mesmo nome em contextos diferentes, como para variáveis locais em funções).
bash
copied ksh
arrays com seu design estranho. Fazer uma cópia de uma matriz em bash
é difícil, você pode usar uma função auxiliar como:
copy_array() { # Args: <src_array_name> <dst_array_name>
eval '
local i
'"$2"'=()
for i in "${!'"$1"'[@]}"; do
'"$2"'[$i]=${'"$1"'[$i]}
done'
}
Para ser usado, por exemplo, como:
$ a0[5]=123
$ x=0
$ copy_array "a$x" var
$ typeset -p var
declare -a var=([5]="123")
ksh
(e bash
que copiou ksh
) é o único shell onde as matrizes são esparsas (ou são matrizes associativas cujas chaves são limitadas a inteiros positivos) (também as únicas matrizes com índices começando em 0 em vez de 1, ou onde $array
não intuitivamente não se expande para os elementos, mas o elemento de indice 0). É muito mais fácil com outras camadas.
-
rc
: array_copy = $array
-
fish
: set array_copy = $array
-
csh
: set array_copy = ($array:q)
-
zsh
ou yash
: array_copy=("${array[@]}"}
Para cópia indireta (em que $var
contém o nome da matriz de origem):
-
rc
: eval array_copy = '$'$var
-
fish
: eval set array_copy \$$var
-
csh
: eval "set array_copy = (\$${var}:q)"
-
zsh
: array_copy=("${(@P)var}")
-
yash
(ou zsh
): eval 'array_copy=("${'"$var"'[@]}")'