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.