Qual é a diferença entre @ e * ao fazer referência aos valores do array bash?

15

Este guia do Bash diz:

Se o número do índice for @ ou *, todos os membros de uma matriz serão referenciados.

Quando eu faço isso:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i "
done

Dá: example.1 example.2 example.3(resultado desejado).

Mas quando eu uso ${LIST[*]}, eu entendo example.1 2 3.

Por quê?

Editar: ao usar printf, @ e * realmente dão os mesmos resultados.

arjan
fonte
Parece funcionar para mim. Eu tentei @ e * e parece produzir o mesmo resultado as vezes. Qual shell você está usando? Execute echo $SHELLe cole o resultado na sua pergunta.
Ramesh
Meu exemplo estava errado, isso realmente acontece apenas com echo, não com printf, acabei de perceber.
arjan
possível duplicata de Qual é a diferença entre $ * e $ @?
Goldilocks
@goldilocks A outra pergunta é sobre $*e $@. Embora a resposta seja semelhante e uma pergunta possa ser considerada um subconjunto da outra, são perguntas diferentes.
Stéphane Chazelas

Respostas:

17

A diferença é sutil; "$ *" cria um argumento, enquanto "$ @" se expande em argumentos separados, portanto:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
 echo "example.$i"
done

irá lidar com a lista (imprimi-la) como múltiplas variáveis

mas

LIST=(1 2 3)
for i in "${LIST[*]}"; do
 echo "example.$i"
done

lidará com a lista como uma variável.

Networker
fonte
Você sabe de onde vem a diferença entre echoe printfvem? Como printfno loop for, a referência da lista * é tratada como várias variáveis.
arjan
O que significa que algo seja tratado como uma versus múltiplas variáveis? Gostaria de saber se você poderia fornecer um exemplo prático para ilustrar a diferença.
fraxture