วิธีการนับความยาวของอาร์เรย์ที่กำหนดไว้ในทุบตี?


57

ฉันใหม่เพื่อทุบตีและไม่สามารถหาบทช่วยสอนที่ดีเพื่อตอบคำถามของฉัน

array=( item1 item2 item3)
for name in ${array[@]}; do
    echo current/total
    ... some other codes
done

ฉันต้องการคำนวณค่า "ปัจจุบัน" และ "รวม" ตามที่คาดหวังเอาท์พุทของสิ่งนี้:

1/3
2/3
3/3

ขอบคุณสำหรับเคล็ดลับใด ๆ


โปรดทราบว่าคุณควรใส่${array[@]}เครื่องหมายคำพูดคู่ array=("item 1" "item 2" "item 3")มิฉะนั้นคำแยกจะดำเนินการและคุณจะได้รับผลที่ไม่พึงประสงค์ในปัจจัยการผลิตเช่น
Gardenhead

คำตอบ:


100

คุณสามารถเข้าถึงดัชนีอาเรย์โดยใช้${!array[@]}และความยาวของอาเรย์โดยใช้${#array[@]}:

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $index/${#array[@]}
done

โปรดทราบว่าเนื่องจากอาร์เรย์ของ bash นั้นไม่มีการทำดัชนีคุณจะได้รับ:

0/3
1/3
2/3

ถ้าคุณต้องการที่นับในการทำงานตั้งแต่วันที่ 1 คุณสามารถแทนที่โดย$index $((index+1))หากคุณต้องการค่าเช่นเดียวกับดัชนีที่คุณสามารถใช้"${array[index]}"เช่น

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $((index+1))/${#array[@]} = "${array[index]}"
done

ให้

1/3 = item1
2/3 = item2
3/3 = item3

ถ้าฉันต้องการได้ 1,2,3 ฉันจะทำสิ่งนี้ได้echo ($index+1)/${#array[@]}ไหม?
AGamePlayer

btw ดูเหมือนว่าด้วยวิธีนี้ฉันไม่สามารถรับ item1, item2, item3 ในลูปได้ ฉันยังมีรหัสอื่นที่จะจัดการกับ item1, item2, item3 stuff ขอบคุณ
AGamePlayer

ดูโพสต์ที่แก้ไข
ขับเหล็ก

1

ดัชนีศูนย์ใช้ได้อย่างสมบูรณ์ถ้าคุณคิดว่าดัชนีนั้นเป็นออฟเซ็ตจากที่อยู่ฐานของอาร์เรย์ นั่นเป็นบรรทัดฐานในความเป็นจริงแม้ว่ามันจะแตกต่างจากภาษาถิ่น ด้วยภาษา Jovial เก่า[0]ขนาดจริงของอาร์เรย์มีขนาดสูงสุด [1]จึงเริ่มต้นด้วย

ด้วยการใช้งานพื้นฐานบางอย่างคุณสามารถเลือกที่จะมีดัชนีอย่างใดอย่างหนึ่ง0หรือ1เป็นดัชนีแรกก็ได้ และอย่างน้อยหนึ่งขั้นพื้นฐานช่วยให้คุณสามารถกำหนดอาร์เรย์ดัชนี Fron ไป[n] [m]ที่nและmสามารถมีค่าจำนวนเต็มใด ๆ แม้ลบตราบใดที่มีค่าน้อยกว่าหรือเท่ากับn mค่าที่nพวกเขาจะกลายเป็นหักออกจาก[index]ป้อนเช่นถ้าดัชนีสอดคล้องกับindex-n = 0n

แต่คุณสามารถทำสิ่งเดียวกันและอื่น ๆ ในรหัสของคุณเอง คุณสามารถย้อนกลับลำดับของอาร์เรย์ด้วยวิธีนี้:

dim array(0, abs(m-n)); 
step=sign(m-n); 
if n > m then 
    base=m 
else 
    base=n; 
fi

ตัวอย่างรหัสนี้จริง ๆ แล้วเป็นเพียงบางส่วนของภาษาเดียว ฉันแค่อยากให้อ่านง่ายขึ้น [0]ตัวแปรขั้นตอนที่ใช้ในการควบคุมทิศทางที่ชัดเจนคุณกำลังจะย้ายในไม่ว่าจะเป็นบวกหรือลบและนำมาใช้ในการคำนวณดัชนีที่มีประสิทธิภาพเมื่อจะเข้าหรือออกจากอาร์เรย์ที่เป็นจริงเสมอในเชิงบวกจากมา

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