bagaimana cara menghitung panjang array yang didefinisikan dalam bash?

58

Saya baru mengenal bash dan tidak dapat menemukan tutorial yang baik untuk menjawab pertanyaan saya.

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

Saya ingin menghitung nilai "saat ini" dan "total", sebagai hasil yang diharapkan dari ini:

1/3
2/3
3/3

Terima kasih atas segala tipnya

AGamePlayer
sumber
Perhatikan bahwa Anda harus memasukkan ${array[@]}tanda kutip ganda. Jika tidak, pemisahan kata akan dilakukan dan Anda akan mendapatkan hasil yang tidak diinginkan, pada input seperti array=("item 1" "item 2" "item 3").
Gardenhead

Jawaban:

102

Anda dapat mengakses indeks array menggunakan ${!array[@]}dan panjang array menggunakan ${#array[@]}, misalnya:

#!/bin/bash

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

Perhatikan bahwa karena bash array nol diindeks , Anda akan benar-benar mendapatkan:

0/3
1/3
2/3

Jika Anda ingin penghitungan berjalan dari 1, Anda dapat menggantinya $indexdengan $((index+1)). Jika Anda menginginkan nilai serta indeks yang dapat Anda gunakan "${array[index]}"yaitu

#!/bin/bash

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

memberi

1/3 = item1
2/3 = item2
3/3 = item3
Steeldriver
sumber
Jika saya ingin mendapatkan 1,2,3, dapatkah saya melakukan ini echo ($index+1)/${#array[@]}:?
AGamePlayer
btw, sepertinya dengan cara ini saya tidak bisa mendapatkan item1, item2, item3 di loop. Saya masih punya kode lain untuk menangani item1, item2, item3 barang. Terima kasih,
AGamePlayer
Lihat pos yang diedit.
steeldriver
1

Indeks nol benar-benar valid jika Anda menganggap indeks sebagai benar-benar offset dari alamat basis array. Sebenarnya itu adalah norma, meskipun bervariasi dari dialek ke dialek. Dengan bahasa Riang tua, [0]sebenarnya berisi ukuran maksimum array. jadi itu dimulai dengan [1].

Dengan beberapa implementasi Dasar, Anda dapat secara sewenang-wenang memilih untuk memiliki salah satu 0atau 1sebagai indeks pertama. Dan setidaknya satu Basic memungkinkan Anda untuk menunjuk array indeks fron [n]untuk [m]. di mana ndan mdapat memiliki nilai integer, bahkan negatif, selama nkurang dari atau sama dengan m. Nilai nmereka menjadi dikurangi dari yang [index]dimasukkan, seolah- index-n = 0olah indeks sesuai dengan n.

Tetapi Anda dapat melakukan hal yang sama dan lebih banyak lagi dalam kode Anda sendiri. Anda bahkan dapat membalik urutan array dengan cara ini:

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

Contoh kode ini sebenarnya hanya sebagian dari satu bahasa. Saya hanya ingin itu lebih mudah dibaca. Variabel langkah digunakan untuk mengontrol arah yang Anda lihat apakah positif atau negatif, dan digunakan untuk menghitung indeks efektif ketika masuk atau keluar dari array, yang sebenarnya selalu positif dari [0].

Donald Darden
sumber