2

bashでポストインクリメントを行う正しい方法についてのちょっとした質問。

while true; do
  VAR=$((CONT++))
  echo "CONT: $CONT"
  sleep 1
done

この場合、VARは1から始まります。

CONT: 1
CONT: 2
CONT: 3

しかし、私がこれを行う場合:

while true; do
  echo "CONT: $((CONT++))"
  sleep 1
done

0から始まります。

CONT: 0
CONT: 1
CONT: 2

((CONT ++))はCONT(undefined、¿0?)を評価し、+ 1を追加するため、最初のケースは正常に動作しているようです。

ステートメントのような動作を取得echoして変数に割り当てるにはどうすればよいですか?

編集:私の最初の例では、CONTをエコーする代わりに、VARをエコーする必要がありました。そうすれば、問題なく動作するので、最初からエラーでした。

4

4 に答える 4

8

どちらの場合も問題なく妥当です。

foo++最初に の現在の値 (自動インクリメント前) を返しfoo、次に自動インクリメントします。

最初のケースで に変更するecho "CONT: $VAR"と、ケース 2 と同じ結果になります。

自動インクリメントを使用したい場合は1,2,3...、次を試すことができます。

echo "CONT: $((++CONT))"
于 2013-02-22T13:51:08.883 に答える
2

コードを単純化して、理解しやすくしましょう。

以下:

  VAR=$((CONT++))
  echo "CONT: $CONT"

次のステップに分けることができます。

  VAR=$CONT            # assign CONT to VAR
  CONT=$((CONT+1))     # increment CONT
  echo "CONT: $CONT"   # print CONT

同様に、次のステートメント:

echo "CONT: $((CONT++))"

次と同等です。

echo "CONT: $CONT"    # print CONT
CONT=$((CONT+1))      # then increment CONT

これが、その動作が見られる理由を説明するのに役立つことを願っています.

于 2013-02-22T13:56:49.657 に答える
1

ポスト インクリメントとは、の値を返し、値をインクリメントすることを意味します。

最初の例では、インクリメントされた後の値を使用します。2番目の例では、インクリメントする前に使用します。

最初の例と同じ結果が必要な場合は、プレフィックスのインクリメントを使用する必要があります

while true; do
    echo "CONT: $((++CONT))"
    sleep 1
done
于 2013-02-22T13:52:15.650 に答える