2017-02-14 55 views
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

回答

3

你可以用一個簡單的計數器,內環內遞增做到這一點:

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

這將使意義,如果所有的邏輯是最內層的循環中,如果我們考慮內執行作爲一個迭代的最重要的循環。


請注意,您需要在數組引用周圍使用雙引號以防止出現分詞和通配符。另外,我認爲你需要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