A “$ @” é uma exceção às aspas duplas?

1

Normalmente, o que está dentro das aspas duplas conta para uma palavra e, portanto, conta para um parâmetro ao chamar um programa com "...". É "$ @" uma exceção, uma vez que é dividido em tantas palavras quanto os parâmetros passados para o script de shell?

    
por huehuehue 30.07.2017 / 00:04

1 resposta

4

Sim, mas também não. É um tipo diferente de divisão.

$@ refere-se a uma matriz; Bash também permite que variáveis regulares sejam arrays e suporta expansões como ${var[*]} ou ${var[@]} . Este último também expande para todos os valores de $ var como palavras separadas.

No entanto, se a expansão estiver entre aspas duplas, então cada valor individual ainda se comporta como se fosse citado - ou seja, a divisão de palavras não acontece. Portanto, não há exceção em que regard - $@ vs "$@" ainda seja igual a $foo vs "$foo" .

Demo

$ var=("Item 1" "Item 2 has spaces" "Item 3? Item 3.")

$ declare -p var
declare -a var=([0]="Item 1" [1]="Item 2 has spaces" [2]="Item 3? Item 3.")

$ args "${var[*]}"
argc = 2
argv[0] = args
argv[1] = Item 1 Item 2 has spaces Item 3? Item 3.

$ args "${var[@]}"
argc = 4
argv[0] = args
argv[1] = Item 1
argv[2] = Item 2 has spaces
argv[3] = Item 3? Item 3.

$ args ${var[@]}
argc = 11
argv[0] = args
argv[1] = Item
argv[2] = 1
argv[3] = Item
argv[4] = 2
argv[5] = has
...
    
por 30.07.2017 / 00:20

Tags