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.