การเข้าถึงตัวแปรดัชนีอาร์เรย์จาก bash shell script loop?


19

ฉันต้องการเข้าถึงตัวแปรดัชนีอาเรย์ขณะวนลูปผ่านอาเรย์ในสคริปต์ bash shell ของฉัน

myscript.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in ${AR[*]}; do
  echo $i
done

ผลลัพธ์ของสคริปต์ด้านบนคือ:

foo
bar
baz
bat

ผลลัพธ์ที่ฉันค้นหาคือ:

0
1
2
3

ฉันจะเปลี่ยนสคริปต์เพื่อให้บรรลุสิ่งนี้ได้อย่างไร


7
นอกจากนี้ยังทราบว่าคุณไม่ต้องการพื้นแทน"${array[*]}" "${array[@]}"ใช้*แทน@มากขึ้นหรือน้อยลงถือว่าเป็นสตริงแทนอาร์เรย์
จอร์แดน

คำตอบ:


27

คุณสามารถทำได้โดยใช้รายการของคีย์อาร์เรย์ จากbashหน้าคน:

${!name[@]}
${!name[*]}

รายการของคีย์อาร์เรย์ หาก name เป็นตัวแปรอาร์เรย์ให้ขยายไปยังรายการของดัชนีอาร์เรย์ (คีย์) ที่กำหนดในชื่อ ถ้า name ไม่ใช่ array ให้ขยายเป็น0ถ้า name ถูกตั้งค่าไว้และ null เป็นอย่างอื่น เมื่อ@มีการใช้งานและการขยายตัวจะปรากฏขึ้นภายในเครื่องหมายคำพูดคู่แต่ละคีย์จะขยายเป็นคำที่แยกต่างหาก

สำหรับตัวอย่างของคุณ:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

ผลลัพธ์นี้ใน:

${AR[0]}=foo
${AR[1]}=bar
${AR[2]}=baz
${AR[3]}=bat

โปรดทราบว่าวิธีนี้ใช้ได้กับดัชนีที่ไม่ต่อเนื่องด้วย:

#!/bin/bash
AR=([3]='foo' [5]='bar' [25]='baz' [7]='bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

ผลลัพธ์นี้ใน:

${AR[3]}=foo
${AR[5]}=bar
${AR[7]}=bat
${AR[25]}=baz

1
แม้ว่าคำตอบนี้จะบรรลุผลตามที่ต้องการ แต่คำสั่ง printf ก็ไม่ได้ทำให้งงงวยโดยไม่จำเป็น ตัวอย่างเช่น: printf "$i=(${AR[i]})\n"หรือecho "$i=(${ARi]})"ทั้งสองให้เพิ่มเล็กน้อยโดยการแสดงวิธีรับคีย์ & var แต่การพูดอย่างเคร่งครัดecho "$i"จะตอบ OP ส่วนที่เหลือก็คือ "bash fu" :)
38414

5

เพิ่มเติมจากคำตอบของ jordanm คุณยังสามารถทำการCวนซ้ำในbash:

for ((idx=0; idx<${#array[@]}; ++idx)); do
    echo "$idx" "${array[idx]}"
done

1

คุณสามารถทำสิ่งนี้:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
length=${#AR[@]}
for (( i = 0; i < length; i++ )); do
  echo "$i"
done

เอาท์พุท:

0
1
2
3

1
สิ่งนี้บอกว่า  คำตอบของ pfnuesel   ไม่ได้พูดแล้ว?
G-Man พูดว่า 'Reinstate Monica'

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