Em zsh, preferência pessoal. Em outros shells, $array
só pode expandir para o primeiro elemento, portanto, ${#array}
produziria o tamanho do primeiro elemento.
Então, se você quiser ser um pouco mais portátil entre os shells, especificar o [@]
funcionaria.
Em zsh, $array
se expande da mesma forma que $array[*]
, o que difere dependendo se eles aparecem entre aspas ou não. Eles devem aparecer entre aspas duplas "$array"
seria expandido e delimitado pelo primeiro caractere de IFS
, que por padrão é espaço
zsh% touch {1..10}; a=(*)
zsh% printf '<%s> ' $a
<1> <10> <2> <3> <4> <5> <6> <7> <8> <9>
zsh% printf '<%s> ' "$a"
<1 10 2 3 4 5 6 7 8 9>
zsh% IFS=:
zsh% print "$a"
1:10:2:3:4:5:6:7:8:9
zsh% print "$a[@]"
1 10 2 3 4 5 6 7 8 9
zsh% IFS=$' \t\n'
zsh% rm "$a"
rm: cannot remove ‘1 10 2 3 4 5 6 7 8 9’: No such file or directory
A alteração de IFS
raramente é necessária, o que gerou minha resposta "Preferências pessoais" original. Mas apenas para esclarecer que há algumas diferenças entre os dois quando usados sem o #
flag, eles são apenas muito sutis.
Eu prefiro $array[@]
também, já que o comportamento não muda dependendo se aparece ou não entre aspas. Isso e espaços em branco internos que um elemento pode ter são preservados.