web-dev-qa-db-ja.com

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

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

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

これの期待される出力として、「現在」と「合計」の値を計算したいと思います。

1/3
2/3
3/3

あらゆる種類のヒントをありがとう

66
AGamePlayer

_${!array[@]}_を使用して配列のインデックスにアクセスし、_${#array[@]}_を使用して配列の長さにアクセスできます。 :

_#!/bin/bash

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

Bash配列はzero indexedであるため、実際には次のようになります。

_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
_
113
steeldriver

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

一部の基本実装では、最初のインデックスとして0または1のいずれかを任意に選択できます。また、少なくとも1つのBasicでは、[n]から[m]にインデックスを付ける配列を指定できます。ここで、nmは、nm以下である限り、任意の整数値(負であっても)を持つことができます。値n themは、入力された[index]から差し引かれます。インデックスがnに対応する場合はindex-n = 0になります。

しかし、あなたはあなた自身のコードで同じことそしてより多くをすることができます。次のように配列の順序を逆にすることもできます。

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

このコード例は、実際には1つの言語の一部にすぎません。もっと読みやすくしたかっただけです。ステップ変数は、正または負に移動する見かけの方向を制御するために使用され、配列に入ったり出たりするときに有効なインデックスを計算するために使用されます。これは、実際には常に[0]から正です。

1
Donald Darden