$ {# array} vs $ {# array [@]}

6

Até onde eu sei, ${#array[@]} e ${#array} avaliam o número de elementos em $array . Existe alguma razão para preferir o formulário mais longo ( ${#array[@]} )?

    
por kjo 26.06.2013 / 22:41

3 respostas

10

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.

    
por 26.06.2013 / 23:08
4

Como em qualquer coisa, quanto mais legível e compreensível for o seu código, mais fácil será para os outros (ou futuros você) manter. Quando você tem uma escolha e uma delas é ambígua, escolha a outra.

Além disso, se você quiser portabilidade em seus scripts de shell, o último é o único que funciona corretamente em bash .

    
por 26.06.2013 / 23:23
4

Na maioria dos shells que suportam arrays (testei em bash , ksh93 e pdksh ), ${#array} fornecerá o comprimento de ${array[0]} e ${#array[@]} fornecerá o número de elementos na matriz. Isso é lógico: "${array}" retorna o elemento 0 da matriz e "${#array}" retorna seu comprimento.

    
por 02.12.2015 / 03:20