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


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


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


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.