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.


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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.