Apa perbedaan antara @ dan * ketika mereferensikan nilai bash array?

15

Panduan Bash ini mengatakan:

Jika nomor indeks adalah @ atau *, semua anggota array direferensikan.

Ketika saya melakukan ini:

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

Memberi: example.1 example.2 example.3 (hasil yang diinginkan).

Tapi ketika saya gunakan ${LIST[*]}, saya mengertiexample.1 2 3 sebagai gantinya.

Mengapa?

Sunting: ketika menggunakan printf, @ dan * sebenarnya memberikan hasil yang sama.

arjan
sumber
Tampaknya bekerja untuk saya. Saya mencoba keduanya @ dan * dan tampaknya menghasilkan hasil yang sama di kedua kali. Shell apa yang Anda gunakan? Jalankan echo $SHELLdan tempel output ke pertanyaan Anda.
Ramesh
Contoh saya salah, ini sebenarnya hanya terjadi dengan echo, bukan dengan printf, saya baru saja perhatikan.
arjan
kemungkinan rangkap dua Apa perbedaan antara $ * dan $ @?
goldilocks
@goldilocks Pertanyaan lainnya adalah tentang $*dan $@. Meskipun, jawabannya akan serupa dan satu pertanyaan dapat dianggap sebagai bagian dari yang lain, mereka adalah pertanyaan yang berbeda.
Stéphane Chazelas

Jawaban:

17

Perbedaannya halus; "$ *" menciptakan satu argumen, sementara "$ @" akan berkembang menjadi argumen terpisah, jadi:

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

akan berurusan dengan daftar (cetak) sebagai beberapa variabel

tapi

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

akan berurusan dengan daftar sebagai satu variabel.

Networker
sumber
Apakah Anda tahu di mana perbedaan antara echodan printfberasal? Karena dengan printfdi dalam for loop, referensi daftar * diperlakukan sebagai beberapa variabel.
arjan
Apa artinya sesuatu harus ditangani sebagai satu versus banyak variabel? Saya ingin tahu apakah Anda dapat memberikan contoh praktis untuk menggambarkan perbedaannya.
Lampiran