2016-11-15 9 views
0

私はちょうどbashでコード化することを学んでいます。私はいくつかの練習問題を実行しています。私は文法に間違ったことをしているように感じますが、どう見てもそれは間違っていません。ループ構文の場合は?

私がここに持っているコードは、1000と10000の間の '幸運な数字'を見つけるはずです。この場合、幸運な数字は、数字の合計が7になる合計数です。ラッキーナンバーの計算はそれ自身で動作しますが、ひとつの入力がない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 

誰もが私が間違ってやっているすべてのアイデア、またはそれを改善するためにも、道を持っている場合、私はそれを本当に感謝:私は唯一の問題であるforループと仮定することができます!

+1

この行の意味は、 'sum $(($ sum?10))'です。私はそれがコピー/ペーストエラーだと仮定しています。 – eddiem

+0

'1 <= 10000'は常にtrueです。 – kaitoy

+2

良い質問は、特定の単一の問題を分離し、その問題を示すために必要な最小限のコードを除いてすべてを削除します。 http://sscce.org/またはhttp://stackoverflow.com/help/mcveを参照してください。 –

答えて

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

forループの変数を変更しています。それをしないでください。コピーを作る。

1

について((I = 1000; I < = 10000;私は++))

あなたは、bashの者のためにすべての最後の隅と隅までをbashのを学びたいのであれば、それは大丈夫ですが、私はあなたを示唆移植可能なBourneシェルの構文に注目してください。

  • これはbashで動作し、何十万人ものプログラマーのために働いています。非常に頻繁に、古い方法は良い方法です。

  • さまざまな状況で非bashコードが発生します。

ほとんどのLinuxシステムでは、配列(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 

シェルスクリプトは、通常はないN回(、ファイル名のリストと言う)、いくつかの入力を反復処理。私はseqがbashがカウントされたループの構文を開発する前に、カウントされたループをサポートするために考案されたと思います。

seqの副産物として、あなたのループボディは変更されないと思います。ループ(whileまたはfor)がseqの入力からiを割り当てているため、本文内のiに何をしても次の繰り返しで失われます。

+0

あなたは{1000..10000}のiのためにもできます。 〜をしてください。 –