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.