2016-03-11 22 views
2

我有一個數組,它在調用函數findVar時將元素添加到它。問題似乎是在for循環中不會更新一次開始運行的元素的數量。'for'具有動態數組大小的循環

當我在for循環結束時進行回顯時,我得到正確數量的元素和最後一個元素,但似乎沒有檢查一次啓動的條件。

for var in "${tempV[@]}" 
do 
    num_words=${#tempV[@]} 
    let i=i+1 
    if ! [ $i -gt $num_words ] 
    then 
     findVar $objBKP $var 
    fi 
done 
+0

是否必須是'bash'?因爲在這一點上,我會考慮使用'perl'。 – Sobrique

+0

是的,只有bash。它可以是一個while循環,但不是循環所必需的 –

+1

順便說一句,考慮養成使用http://shellcheck.net/的習慣;你在這裏遇到了一些與缺失的引號相關的錯誤。 –

回答

2

對於迭代計數器以外的任何內容,您都沒有使用$i。你發佈的例子中完全沒有必要。相反,只是迭代變量擴展的內容。例如:

for var in "${tempV[@]}"; do 
    findVar "$objBKP" "$var" 
done 
+1

這沒有幫助。最初的擴展只發生一次,所以新的元素永遠不會被循環。 –

+0

@EtanReisner你假設* tempV *是一個數組,需要通過索引來解決。這在OP的任何地方都沒有提及,並且基於沒有證據的信息。如果你想以你對問題的替代解釋爲基礎,太棒了!否則,評論只是自行車脫落。無論哪種方式,祝你好運! –

+1

我確實(但這是我在答案中列出的警告,而不是你的答案的問題)。答案的問題是,通過調用'findVar'添加到*'tempV'的條目*將永遠不會被循環,因爲循環語句中'tempV'的擴展發生在*這些條目添加之前。試試'a =(1 2 3);因爲我在「$ {a [@]}」;做一個+ =(「$我$我」);回聲「循環$ i」;完成; declare -p a',看看你在循環中得到了什麼值,以及'a'最終包含的值。 –

3

您的嘗試循環遍歷數組中的每個原始元素,然後確保您沒有循環多次並調用您的函數。

這不起作用,因爲tempV的原始擴展發生一次,因此添加的條目從未見過。但這也是沒有意義的,因爲根據定義,如果循環遍歷數組的元素,則不能循環多次,那麼中的元素。

你想要做什麼(假設一個非稀疏的,整數索引的數組,只附加)循環數值並檢查你沒有超出數組大小作爲循環條件。

像這樣(未經):

i=0 
while [ "$i" -lt "${#tempV[@]}" ]; do 
    var=${tempV[i]} 
    findVar "$objBKP" "$var" 
    i=$((i + 1)) 
done