bash içinde tanımlanan bir dizinin uzunluğunu nasıl sayabilirim?


57

Ben bash için yeniyim ve sorumu cevaplamak için iyi bir eğitim bulamıyorum.

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

Bunun beklenen çıktısı olarak "geçerli" ve "toplam" değerini hesaplamak istiyorum:

1/3
2/3
3/3

Her türlü ipucu için teşekkürler


${array[@]}Çift tırnak içine almanız gerektiğini unutmayın . Aksi takdirde, kelime bölme işlemi yapılacak ve benzeri girdilerde istenmeyen sonuçlar elde edeceksiniz array=("item 1" "item 2" "item 3").
gardenhead

Yanıtlar:


100

Kullanarak dizi indekslerine ${!array[@]}ve ${#array[@]}örneğin kullanarak dizinin uzunluğuna erişebilirsiniz :

#!/bin/bash

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

Bash dizileri sıfır dizinli olduğundan , gerçekten alacaksınız:

0/3
1/3
2/3

Eğer sayım 1'den çalıştırmak isterseniz değiştirebilirsiniz $indextarafından $((index+1)). İsterseniz değerleri yanı sıra indeksleri kullanabilirsiniz "${array[index]}"yani

#!/bin/bash

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

vererek

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

Ben 1,2,3 almak istiyorsanız, bunu yapabilirsiniz: echo ($index+1)/${#array[@]}?
AGamePlayer,

btw, öyle görünüyor ki döngüde item1, item2, item3 alamıyorum. Hala item1, item2, item3 ile başa çıkmak için başka bir kodum var. Teşekkürler,
AGamePlayer

Düzenlenmiş gönderiye bakın.
Steeldriver

1

Dizinin aslında bir dizinin taban adresinden kayması olduğunu düşünüyorsanız, sıfır dizini tamamen geçerlidir . Aslında norm, lehçeden lehçeye değişse de aslında budur. Eski Jovial dili ile, [0]aslında dizinin maksimum boyutunu içeriyordu. bu yüzden başladı [1].

Bazı Temel uygulamalarda, isteğe bağlı olarak ya 0da 1ilk dizini seçmeyi seçebilirsiniz . Ve en az bir Temel, fron'u indekslemek [n]için dizileri atamanıza izin verir [m]. Her ne kadar nve mherhangi bir tamsayı değerine sahip olabilir, neşit veya daha az olduğu sürece negatif m. Değeri nonlara çıkarılır olur [index], girilirken index-n = 0endeksi karşılık eğer n.

Ancak aynı şeyi ve daha fazlasını kendi kodunuzda da yapabilirsiniz. Bir dizinin sırasını şu şekilde bile ters çevirebilirsiniz:

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

Bu kod örneği aslında sadece bir dilin parçasıdır. Sadece daha okunaklı olmasını istedim. Adım değişkeni, pozitif veya negatif olarak hareket ettiğiniz görünür yönü kontrol etmek için kullanılır ve aslında her zaman pozitif olan diziden girerken veya çıkarken etkin dizini hesaplamak için kullanılır [0].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.