2013-02-22 62 views
1

只是關於在bash中進行後增量的正確方法的一個小問題。Bash Post Increment

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(未定義,¿0?)並添加+1。

我怎樣才能得到像echo語句中的行爲分配給一個變量?

編輯:在我的第一個例子中,而不是回顯CONT,我應該回顯VAR,這樣它的工作正常,所以這是我從一開始的錯誤。

回答

5

案件是可以和合理的。

foo++將首先返回foo的當前值(自動遞增之前),然後自動遞增。

在第一種情況下,如果你改變成echo "CONT: $VAR",它會給相同的結果的情況下2.

如果你想有1,2,3...,通過自動遞增,你可以嘗試:

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

謝謝,我明白了,但我想在賦值給變量而不是回聲中做。在回聲中它工作正常,但不是當我分配給變量(我不知道從0開始的正確方法)。 – JorgeeFG 2013-02-22 13:55:17

+0

我剛剛注意到它的效果很好,並且是我在第一個示例中的錯誤,而不是回顯VAR,我回應了CONT。這就是爲什麼它沒有工作。 – JorgeeFG 2013-02-22 13:58:14

+0

@Jorge您的第一個案例('$ VAR')從0開始 – Kent 2013-02-22 13:58:36

1

遞增意味着,返回先前的值,然後遞增該值。

在第一個示例中,在之後使用值將其遞增。在你的第二個例子中,你在之前使用來增加它。

如果你想同樣的結果在第一個例子中,你必須使用前綴增量

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

謝謝,我理解它,但我想在賦值給變量而不是回聲中做。在回聲中它工作正常,但不是當我分配給變量(我不知道從0開始的正確方法)。 – JorgeeFG 2013-02-22 13:55:41

+0

我只注意到它的效果很好,並且是第一個例子中的錯誤。 – JorgeeFG 2013-02-22 13:57:28

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 

希望這有助於解釋你爲什麼會看到這種行爲。

+0

我剛剛注意到它的效果很好,並且是我在第一個示例中的錯誤,而不是回顯VAR,我回應了CONT。這就是爲什麼它沒有工作。 – JorgeeFG 2013-02-22 13:59:34