2017-02-14 21 views
2

2つ以上の配列を使用するネストループの場合、ネストされたループ内の反復番号を取得する

A=(0.1 0.2) 
B=(2 4 6) 

AB=$((${#A[@]}*${#B[@]})) # total number of iterations (length of A * length of B) 

for a in ${A[*]}; do 
    for b in ${B[*]}; do 

    $(($a+$b)) # task using each combination of A and B 
    echo ? # show number of the iteration (i.e. 1 to length of AB) 

    done 
done 

echoを使用して上記のように、反復の数を取得するための最良の方法は何ですか?すべてのロジックは、最も内側のループ内で、我々は内部の実行を検討している場合である場合、これは理にかなって

i=0 
for a in "${A[@]}"; do 
    for b in "${B[@]}"; do 
    ((i++)) 
    printf "Iteration: $i\n" 
    : your code 
    done 
done 

答えて

3

あなたは内側のループ内でインクリメントされ、簡単なカウンタでこれを行うことができます一番最後のループは1回の繰り返しです。


単語の分割とグロブを防ぐには、配列の参照を二重引用符で囲む必要があります。また、すべての要素を連結したバージョンではなく、個別に各要素を必要としている限り、array[*]ではなく、array[@]が必要です。

+0

ありがとうございました。このメソッドは、この例ではうまく機能します。しかし、 'set -e'(エラー時に終了)でスクリプトを起動すると、何も表示されません。明らかに重要ではありませんが、これはこのコードに不完全さがあることを示していますか? – user3743235

+0

@ user3743235 'i = 1'で始まり、'((++ i)) 'を使うと、' set -e'で動作します。しかし、なぜ私には分かりませんか。 – pfnuesel

0

与えられた例と@codeforesterで提案されている方法に基づいて、これは私のために働いたものです(スクリプトの先頭近くにset -eが含まれています)。この例では

i=1 
for a in ${A[*]}; do 
    for b in ${B[*]}; do 
    I=$((i++)) 
    echo "Iteration: $I" 
    echo "Combination: $a $b" # show combination of A and B elements 
    # task code 
    done 
done 

、二重引用符なしarray[*]は、ネストされたループ内の各反復数を見つけながら、AB値のユニークな組み合わせを生成するためにループ内で別々に各要素を使用して、所望の結果を生じました。

+0

これはあなたのケースではうまくいくかもしれませんが、すでに@codeforesterによって指摘されているいくつかの問題があります。 – pfnuesel

関連する問題