¿Cuál es la diferencia entre @ y * al hacer referencia a valores de matriz bash?

15

Esta guía de Bash dice:

Si el número de índice es @ o *, se hace referencia a todos los miembros de una matriz.

Cuando hago esto:

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

Da: example.1 example.2 example.3(resultado deseado).

Pero cuando uso ${LIST[*]}, obtengo en su example.1 2 3lugar.

¿Por qué?

Editar: cuando se utiliza printf, @ y * realmente dan los mismos resultados.

Arjan
fuente
Parece funcionar para mí Intenté tanto @ como * y parece producir el mismo resultado las dos veces. ¿Qué caparazón estás usando? Ejecute echo $SHELLy pegue el resultado a su pregunta.
Ramesh
Mi ejemplo fue incorrecto, esto en realidad sucede solo con echo, no con printf, acabo de notar.
arjan
posible duplicado de ¿Cuál es la diferencia entre $ * y $ @?
Ricitos
@goldilocks La otra pregunta es sobre $*y $@. Sin embargo, la respuesta sería similar y una pregunta podría considerarse un subconjunto de la otra, son preguntas diferentes.
Stéphane Chazelas

Respuestas:

17

La diferencia es sutil; "$ *" crea un argumento, mientras que "$ @" se expandirá en argumentos separados, entonces:

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

tratará la lista (imprímala) como múltiples variables

pero

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

tratará con la lista como una variable.

Nidal
fuente
¿Sabes de dónde viene la diferencia entre echoy printf? Porque con printfen el bucle for, la referencia de lista * se trata como variables múltiples.
arjan
¿Qué significa que algo sea tratado como una variable versus múltiples variables? Me pregunto si podría proporcionar un ejemplo práctico para ilustrar la diferencia.
fraxture