This Bash guide says:

If the index number is @ or *, all members of an array are referenced.

When I do this:

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

Gives: example.1 example.2 example.3 (desired result).

But when I use ${LIST[*]}, I get example.1 2 3 instead.


Edit: when using printf, @ and * actually do give the same results.

  • It seems to work for me. I tried both @ and * and it seems to produce the same result both the times. What shell you are using? Run echo $SHELL and paste the output to your question. – Ramesh Jun 7 '14 at 14:26
  • My example was wrong, this actually happens only with echo, not with printf, I just noticed. – arjan Jun 7 '14 at 14:36
  • possible duplicate of What is the difference between $* and $@? – goldilocks Jun 7 '14 at 17:13
  • @goldilocks The other question is about $* and $@. Though, the answer would be similar and one question could be considered a subset of the other, they are different questions. – Stéphane Chazelas Jun 7 '14 at 19:31

The difference is subtle; "$*" creates one argument, while "$@" will expand into separate arguments, so:

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

will deal with the list (print it) as multiple variables


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

will deal with the list as one variable.

|improve this answer|||||
  • Do you know where the difference between echo and printf comes from? Because with printf in the for loop, the * list reference is treated as multiple variables. – arjan Jun 7 '14 at 14:45
  • What does it mean for something to be dealt with as one versus multiple variables? I wonder if you could provide a practical example to illustrate the difference. – fraxture Mar 22 '19 at 13:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.