Nenhum desses funciona corretamente:
a=($(echo $@))
b=$@
O primeiro expande $@
com divisão de palavras e globbing, portanto os valores com espaço em branco não permanecerão intactos e qualquer coisa que se pareça com um caractere curinga será expandida.
O segundo colapsará toda a matriz em um único valor escalar com os elementos da matriz unidos aos espaços (Bash / ksh) ou com o primeiro caractere de IFS
(Busybox / dash / Zsh; como com "$*"
).
Conceitualmente, usar $@
em um contexto escalar também parece errado. É usado para expandir para uma lista de valores e aqui não podemos ter um. Se você quiser concatenar os elementos da matriz, sugiro usar s="$*"
explicitamente. (As citações ajudam a evitar erros em alguns shells.)
Por exemplo:
$ touch file1 file2
$ set -- "foo bar" "*"
$ a=($(echo $@))
$ declare -p a
declare -a a=([0]="foo" [1]="bar" [2]="file1" [3]="file2")
e
$ b=$@
$ declare -p b
declare -- b="foo bar *"
A melhor maneira de fazer uma cópia de $@
ou uma matriz é
c=("$@")
c=("${myarray[@]}")
embora ambos colapsem os índices da matriz para começar do zero (observe o índice de *
antes e depois):
$ unset l; l[0]="foo bar"; l[2]="*"
$ c=("${l[@]}")
$ declare -p c
declare -a c=([0]="foo bar" [1]="*")
Isso normalmente não é um problema, já que você não obterá matrizes com índices não consecutivos por acidente.