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