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.


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


@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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.