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.


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


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.