Sự khác biệt giữa @ và * khi tham chiếu các giá trị mảng bash là gì?


15

Hướng dẫn Bash này nói:

Nếu số chỉ mục là @ hoặc *, tất cả các thành viên của một mảng được tham chiếu.

Khi tôi làm điều này:

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

Cho: example.1 example.2 example.3(kết quả mong muốn).

Nhưng khi tôi sử dụng ${LIST[*]}, tôi nhận được example.1 2 3thay thế.

Tại sao?

Chỉnh sửa: khi sử dụng printf, @ và * thực sự cho kết quả tương tự.


Nó dường như làm việc cho tôi. Tôi đã thử cả @ và * và dường như cả hai đều cho kết quả như nhau. Bạn đang sử dụng vỏ gì? Chạy echo $SHELLvà dán đầu ra cho câu hỏi của bạn.
Ramesh

Ví dụ của tôi là sai, điều này thực sự chỉ xảy ra với echo, không phải với printf, tôi chỉ nhận thấy.
arjan


@goldilocks Câu hỏi khác là về $*$@. Mặc dù, câu trả lời sẽ tương tự nhau và một câu hỏi có thể được coi là một tập hợp con khác, chúng là những câu hỏi khác nhau.
Stéphane Chazelas

Câu trả lời:


17

Sự khác biệt là tinh tế; "$ *" tạo một đối số, trong khi "$ @" sẽ mở rộng thành các đối số riêng biệt, vì vậy:

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

sẽ xử lý danh sách (in nó) dưới dạng nhiều biến

nhưng

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

sẽ đối phó với danh sách như một biến.


Bạn có biết sự khác biệt giữa echoprintfđến từ đâu? Bởi vì printftrong vòng lặp for, tham chiếu danh sách * được coi là nhiều biến.
arjan

Điều gì có nghĩa là một cái gì đó được xử lý như một so với nhiều biến? Tôi tự hỏi nếu bạn có thể cung cấp một ví dụ thực tế để minh họa sự khác biệt.
fraxture
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.