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.


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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.