2016-11-15 222 views
0

我只是學習用bash編碼,而且我遇到了一些練習題。我覺得我可能會在語法上做錯了什麼,但不管我怎麼看它都沒有錯。For循環語法?

我在這裏得到的代碼應該找到1000到10000之間的'幸運數字'。在這種情況下,幸運數字是一個數字,數字總和爲一個數字,總和爲7。幸運數字的計算是獨立運作的,但是一旦我把它放到一個for循環中,沒有單一輸入的地方,輸出就是無限的和錯誤的。我只能假設for循環的問題是:

digit=0 
sum=0 
for ((i=1000; i<=10000; i++)) 
do 
    while [ $i -gt 0 ] 
    do 
      digit=$(($i % 10)) 
      i=$(($i/10)) 
      sum=$(($sum + $digit)) 
    done 
    while [ $sum -gt 0 ] 
    do 
      digit=$(($sum % 10)) 
      sum$(($sum/10)) 
      sum2=$(($sum2 + $digit)) 
    done 
    if [[ $sum2 == 7 ]]; 
    then 
      echo $sum2 
    fi 
done 

如果任何人有任何想法,我做錯了,甚至能讓它更好,我將不勝感激!

+1

這一行的意圖是什麼:'sum $(($ sum?10))'。我假設這是一個複製/粘貼錯誤。 – eddiem

+0

'1 <= 10000'總是如此。 – kaitoy

+2

一個很好的問題是隔離一個單一的具體問題,並刪除所有內容,但只需展示該問題所需的最少代碼量。請參閱http://sscce.org/或http://stackoverflow.com/help/mcve –

回答

2
i=$(($i/10)) 

您正在修改for循環的變量。不要那樣做;複製一份。

1

爲((I = 1000;我< = 10000;我+ +))

如果您想了解對於bash的緣故,每一個最後的角落慶典,這很好,但我建議你將注意力集中在可移植的Bourne shell語法上。

  • 它在bash中工作,它已經爲數百萬程序員工作了數十年。很多時候,老方法是好方法。

  • 您將在各種情況下遇到非bash代碼。

大多數Linux系統包括SEQ(1)。因此,這些工作:

$ for i in $(seq 1000 10000); do echo $i; done | wc -l 
9001 
$ seq 1000 10000 | while read i; do echo $i; done | wc -l 
9001 

Shell腳本通常遍歷一些輸入(文件名列表,說)不是ñ倍。我猜seq是爲了在bash開發計數循環語法之前支持計數循環而發明的。

作爲使用seq的副產品,我認爲你的循環體不會改變。因爲循環(while或for)從seq的輸入中分配i,所以在下一次迭代中,無論您對i做什麼,都會丟失。

+0

你也可以'爲我在{1000..10000};做...'。 –