Você perdeu o caso em que ele mostra que *
expandirá a matriz para uma única string e @
expandirá para strings citadas individualmente:
printf 'string "%s"\n' "${cape[*]}"
que gera
string "Ping Pong King Kong King Fisher Club Blurb"
e
printf 'string "%s"\n' "${cape[@]}"
que gera
string "Ping Pong"
string "King Kong"
string "King Fisher Club"
string "Blurb"
Lembre-se que echo
apenas concatena seus argumentos e os imprime, enquanto printf
preencherá sua string de formato com os argumentos e repetirá o mesmo formato se mais argumentos forem fornecidos.
Além disso,
for s in "${cape[*]}"; do
echo "$s"
done
gera uma única linha de saída, enquanto
for s in "${cape[@]}"; do
echo "$s"
done
gera um por elemento de matriz.
Sempre deseje usar aspas duplas em torno das expansões ${array[*]}
e ${array[@]}
, a menos que você queira, por algum motivo, invocar explicitamente a divisão de palavras e a globulação de nomes de arquivos. E você usa *
ou @
dependendo se você precisa dos elementos da matriz todos juntos como uma string, ou citados individualmente.
Na minha experiência, raramente se usa [*]
.
Ao obter o tamanho de uma matriz, não importa qual *
ou @
você usa. Mas se você não usar nenhum, você obterá o tamanho do primeiro elemento do array.