Quelle est la différence entre @ et * lors du référencement de valeurs de tableau bash?

15

Ce guide Bash dit:

Si le numéro d'index est @ ou *, tous les membres d'un tableau sont référencés.

Quand je fais ça:

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

Donne: example.1 example.2 example.3(résultat souhaité).

Mais quand j'utilise ${LIST[*]}, j'obtiens à la example.1 2 3place.

Pourquoi?

Edit: lorsque vous utilisez printf, @ et * donnent en fait les mêmes résultats.

arjan
la source
Il semble fonctionner pour moi. J'ai essayé à la fois @ et * et cela semble produire le même résultat les deux fois. Quel shell utilisez-vous? Exécutez echo $SHELLet collez la sortie dans votre question.
Ramesh
Mon exemple était faux, cela ne se produit qu'en fait echo, pas avec printf, je viens de le remarquer.
arjan
doublon possible de Quelle est la différence entre $ * et $ @?
goldilocks
@goldilocks L'autre question concerne $*et $@. Bien que la réponse soit similaire et qu'une question puisse être considérée comme un sous-ensemble de l'autre, ce sont des questions différentes.
Stéphane Chazelas

Réponses:

17

La différence est subtile; "$ *" crée un argument, tandis que "$ @" se développera en arguments séparés, donc:

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

traitera la liste (l'imprimer) comme plusieurs variables

mais

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

traitera la liste comme une variable.

Nidal
la source
Savez-vous d'où vient la différence entre echoet printfvient? Parce que printfdans la boucle for, la référence de la liste * est traitée comme plusieurs variables.
arjan
Qu'est-ce que cela signifie que quelque chose soit traité comme une ou plusieurs variables? Je me demande si vous pourriez fournir un exemple pratique pour illustrer la différence.
fraxture