อะไรคือความแตกต่างระหว่าง @ และ * เมื่ออ้างอิงค่า bash array?


15

คู่มือ Bash นี้พูดว่า:

หากหมายเลขดัชนีคือ @ หรือ * สมาชิกทั้งหมดของอาร์เรย์จะถูกอ้างอิง

เมื่อฉันทำสิ่งนี้:

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

ให้: example.1 example.2 example.3(ผลลัพธ์ที่ต้องการ)

แต่เมื่อฉันใช้${LIST[*]}ฉันได้รับexample.1 2 3แทน

ทำไม?

แก้ไข: เมื่อใช้ printf, @ และ * จริงจะให้ผลลัพธ์เดียวกัน


ดูเหมือนว่าจะทำงานให้ฉัน ฉันลองทั้ง @ และ * และดูเหมือนว่าจะให้ผลลัพธ์เดียวกันทั้งสองครั้ง คุณใช้เปลือกอะไร เรียกใช้echo $SHELLและวางผลลัพธ์ลงในคำถามของคุณ
Ramesh

ตัวอย่างของฉันไม่ถูกต้องสิ่งนี้เกิดขึ้นechoกับprintfฉันไม่ได้สังเกตเห็น
arjan

มีความเป็นไปได้ที่ซ้ำกันของ$ * และ $ @ คืออะไร
goldilocks

@goldilocks คำถามอื่น ๆ ที่เป็นเรื่องเกี่ยวกับและ$* $@แม้ว่าคำตอบจะคล้ายกันและคำถามหนึ่งอาจถือเป็นชุดย่อยของคำถามอื่น แต่เป็นคำถามที่แตกต่างกัน
Stéphane Chazelas

คำตอบ:


17

ความแตกต่างนั้นบอบบาง "$ *" สร้างอาร์กิวเมนต์หนึ่งตัวในขณะที่ "$ @" จะขยายออกเป็นอาร์กิวเมนต์แยกต่างหากดังนั้น:

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

จะจัดการกับรายการ (พิมพ์) เป็นตัวแปรหลายตัว

แต่

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

จะจัดการกับรายการเป็นตัวแปรเดียว


คุณรู้หรือไม่ว่าความแตกต่างระหว่างechoและprintfมาจากไหน เนื่องจากprintfใน for for loop การอ้างอิงรายการ * จะถือว่าเป็นตัวแปรหลายตัว
arjan

การจัดการกับสิ่งใดสิ่งหนึ่งมีความหมายกับตัวแปรหลายตัว ฉันสงสัยว่าคุณสามารถให้ตัวอย่างเชิงปฏิบัติเพื่อแสดงความแตกต่างได้หรือไม่
fraxture
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.