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.


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


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.