Para preceder elementos a um array, você pode simplesmente fazer:
a[1,0]=(more elements)
Ou você pode fazer:
a=(more elements "$a[@]")
Observe que fazendo:
a=(more elements $a)
removeria os elementos vazios em $a
.
Agora, para criar uma função para isso, é para isso que o eval
serve, mas você precisa ter a sintaxe correta:
prepend() {
eval "${1}[1,0]"='("${@[2,-1]}")'
}
Veja como o ("${@[2,-1]}")
está entre aspas simples, por isso é passado literalmente para eval
.
Ou o caminho mais longo, mas não funcionaria para prepend var more elements
(quando o nome da variável for var
):
prepend() {
local var=$1; shift
eval "$var"='("$@" "${'"$var"'[@]}")'
}
O código que você deseja eval
avalia sobre prepend varname ...
é:
varname=("$@" "${varname[@]")
Você não deseja que "$@"
seja expandido antes de ser passado para eval
. Somente $var
precisa ser expandido para lá.
Observe que o sinalizador de expansão da variável P
é tão perigoso quanto eval
quando usado com dados não-analisados.
var='x[$(uname>&2)0]'
echo "${(P)var}"
Será executado o comando uname
.