bashで定義された配列の長さを数える方法は?


58

私はbashが初めてなので、質問に答えるための良いチュートリアルが見つかりません。

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")
ガーデンヘッド

回答:


102

を使用して配列のインデックスにアクセスし、を使用して配列${!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

ところで、この方法ではループ内でitem1、item2、item3を取得できないようです。item1、item2、item3を処理する他のコードがまだあります。ありがとう、
-AGamePlayer

編集済みの投稿をご覧ください。
スチールドライバー

1

インデックスが実際に配列のベースアドレスからのオフセットであると考える場合、ゼロインデックスは完全に有効です。方言ごとに異なりますが、実際はそれが標準です。古いJovial言語では、[0]実際には配列の最大サイズが含まれていました。で始まった[1]

一部のBasic実装では、最初のインデックスとして、0または1最初のインデックスとして任意に選択できます。そして、少なくとも1つの塩基を使用すると、インデックスフロンに配列を指定することができます[n][m]。ここでnおよびは、以下であるm限り、任意の整数値、負の値も持つことができます。インデックスがに対応するかのように、入力から値が減算されます。nmn[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.