newarray = ($ (echo $ @)) e newarray = $ @

0

Eu segui uma instrução que demonstra os seguintes códigos '

function testit()
{ 
    local newarray 
    newarray=($(echo $@))
    echo "The new array value is: ${newarray[*]}" 
}
myarray=(1 2 3 4 5) 
echo "The original array is ${myarray[*]}" 
testit ${myarray[*]}

Estou curioso sobre newarray=$(echo $@) e o outro exemplo das instruções como arg1=$(echo ${myarray[*]})

newarray=$@ é direto e intuitivo, qual é o benefício de fazer um esforço extra.

    
por JawSaw 29.10.2018 / 11:01

2 respostas

4

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.

    
por 29.10.2018 / 11:07
0

newarray=$@ atribuirá a string $@ inteira à variável escalar única newarray , não a uma matriz.

A "substituição de comando" usando echo também é inútil. Você será bem-sucedido ao atribuir um array com newarray=($@) , como você pode ver ao produzir a contagem de elementos do array, como

 newarray=($@); echo "The new array value is: ${newarray[*]}, ${#newarray[@]}"
 The new array value is: 1 2 3 4 5, 5

ao contrário de

newarray=$@; echo "The new array value is: ${newarray[*]}, ${#newarray[@]}"
The new array value is: 1 2 3 4 5, 1
    
por 29.10.2018 / 11:17

Tags