2016-10-28 5 views
0

を終了しませんが、私は動作しません、次のBashスクリプト。整数比較とループは決して

を証明するために、次の最小限の例を書いた:

#! /bin/bash 

n=1 m=2 

while ((n < m)) 
    echo "$n $m" 
    ((n=n+1)) 
do 
    continue 
done 

DOES次の仕事:私は理解して

#! /bin/bash 

n=1 m=2 

while true 
    echo "$n $m" 
    ((n=n+1)) 
do 
    if ((n < m)) 
    then 
     continue 
    else 
     break 
    fi 
done 

なぜ2番目のフォームが機能するのか?私はなぜ最初のフォームが動作しないのか分かりません。

私は、これらのスクリプトが同等であると考えて書きました。 (同じ出力を生成します。)しかし、最初のループ無限大!なぜこれが起こるのですか?

答えて

3

まず、ドキュメントを簡単に見:

$ help while 
while: while COMMANDS; do COMMANDS; done 
    Expand and execute COMMANDS as long as the final command in the 
    `while' COMMANDS has an exit status of zero. 

注意正確なテキスト:最後のコマンドwhileコマンドでは、終了ステータスカウント1です。後でそれに戻ります。元のコードで


while ((n < m)) 
    echo "$n $m" 
    ((n=n+1)) 
do 
    continue 
done 

...あなたは((n < m))があなたの条件として、真であるかどうかをチェックされていません。代わりに、((n = n + 1))が真であるかどうかをチェックしています。

doすべてがループの実行を継続するか否かを判断する条件を形成するために構成され、改行または; Sによって分離された一連のコマンドの終了ステータスが終了ステータスであるので、これは真でありますそのシリーズの最後のコマンド。 ((n = n + 1))が真でない唯一の場合(初期値が0より小さく、結果が0以下である場合は、整数に強制できないか、そうでなければエラーを引き起こす内容がないと仮定します)。あなたが本当にすべてのこれらのコマンドは、あなたの状態の内側になりたい場合は

、あなたの代わりに書くことができます:

while ((n < m)) && echo "$n $m" && ((n = n + 1)); do :; done 

を...比較がある場合は多少異なる動作を持っている、もちろん(「echo'ingしていないが失敗した)。


ではなく、考えてみましょう:

while ((n < m)); do 
    echo "$n $m" 
    ((n++)) 
done 
+0

のbashの狂気 - おかげでこれがうまく物事をクリア! – user3728501

+0

@ user3728501、あなたが 'while(n

+0

それは必ずしも良いまたは悪い言語のデザインではありません。私は構文を理解できませんでした。誤解文法!=汚いコーディング。 – user3728501