Was ist der Unterschied zwischen @ und *, wenn auf Bash-Array-Werte verwiesen wird?

15

Dieser Bash-Leitfaden sagt:

Wenn die Indexnummer @ oder * ist, wird auf alle Mitglieder eines Arrays verwiesen.

Wenn ich das mache:

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

Gibt: example.1 example.2 example.3(gewünschtes Ergebnis).

Aber wenn ich benutze ${LIST[*]}, bekomme ich example.1 2 3stattdessen.

Warum?

Bearbeiten: Wenn Sie printf verwenden, liefern @ und * tatsächlich die gleichen Ergebnisse.

Arjan
quelle
Es scheint für mich zu funktionieren. Ich habe sowohl @ als auch * ausprobiert und es scheint immer dasselbe Ergebnis zu liefern. Welche Shell benutzt du? Führen Sie echo $SHELLdie Ausgabe aus und fügen Sie sie in Ihre Frage ein.
Ramesh
Mein Beispiel war falsch, das passiert eigentlich nur mit echo, nicht mit printf, habe ich gerade gemerkt.
Arjan
mögliches Duplikat von Was ist der Unterschied zwischen $ * und $ @?
Goldlöckchen
@goldilocks Die andere Frage dreht sich um $*und $@. Die Antwort wäre zwar ähnlich und eine Frage könnte als Teilmenge der anderen angesehen werden, es handelt sich jedoch um unterschiedliche Fragen.
Stéphane Chazelas

Antworten:

17

Der Unterschied ist subtil; "$ *" erstellt ein Argument, während "$ @" in separate Argumente umgewandelt wird.

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

behandelt die Liste (drucke sie aus) als mehrere Variablen

aber

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

behandelt die Liste als eine Variable.

Networker
quelle
Wissen Sie, woher der Unterschied zwischen echound printfkommt? Weil mit printfin der for-Schleife die * -Listenreferenz als mehrere Variablen behandelt wird.
Arjan
Was bedeutet es, wenn etwas als eine gegenüber mehreren Variablen behandelt wird? Ich frage mich, ob Sie ein praktisches Beispiel liefern könnten, um den Unterschied zu veranschaulichen.
Fraxture