Jaka jest różnica między @ a * podczas odwoływania się do wartości tablicy bash?

15

Ten przewodnik Bash mówi:

Jeśli numerem indeksu jest @ lub *, odwołuje się do wszystkich elementów tablicy.

Kiedy to zrobię:

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

Daje: example.1 example.2 example.3(pożądany wynik).

Ale kiedy używam ${LIST[*]}, dostaję example.1 2 3zamiast tego.

Dlaczego?

Edycja: podczas korzystania z printf, @ i * faktycznie dają te same wyniki.

arjan
źródło
Wydaje mi się, że to działa. Próbowałem zarówno @, jak i * i wydaje się, że daje ten sam rezultat za każdym razem. Jakiej powłoki używasz? Uruchom echo $SHELLi wklej wynik do swojego pytania.
Ramesh
Mój przykład był błędny, tak naprawdę dzieje się tak tylko z echo, a nie z printf, właśnie zauważyłem.
arjan
możliwy duplikat Jaka jest różnica między $ * a $ @?
goldilocks
@goldilocks Drugie pytanie dotyczy $*i $@. Chociaż odpowiedź byłaby podobna, a jedno pytanie można uznać za podzbiór drugiego, są to różne pytania.
Stéphane Chazelas

Odpowiedzi:

17

Różnica jest subtelna; „$ *” tworzy jeden argument, podczas gdy „$ @” rozwinie się w osobne argumenty, więc:

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

zajmie się listą (wydrukuje ją) jako wiele zmiennych

ale

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

będzie traktować listę jako jedną zmienną.

Nidal
źródło
Czy wiesz, gdzie różnica między echoi printfpochodzi? Ponieważ printfw pętli for odwołanie do listy * jest traktowane jako wiele zmiennych.
arjan
Co to znaczy traktować coś jako jedną kontra wiele zmiennych? Zastanawiam się, czy mógłbyś podać praktyczny przykład ilustrujący różnicę.
fraxture