2011-11-10 47 views
2

簡單變量測試:變量復位

#!/bin/bash 

N=0 

ls -l | while read L; do 
N=$((N+1)) 
echo $N 
done 

echo "total $N" 

運行它然後輸出:

1 
2 
3 

total 0 

我預期的最終N = 3: 「總3」,但爲什麼值循環後重置爲0?

+1

解決爲已知的子shell的問題。 check out http://stackoverflow.com/questions/5006229/why-does-my-bash-counter-reset-after-while-loop – sof

+0

你可以用((N ++))替換$((N + 1)))具有相同的結果 – ata

回答

8

bash在其自己的子shell中的管道中運行每個語句。 (對於外部命令,例如ls,subshel​​l只是exec的命令。)這有效地使所有變量都是本地的。您通常必須通過使用重定向或命令替換而不是管道來解決此問題。

編輯:這似乎工作:

#!/bin/bash 
IFS= 
N=0 

while read L; do 
    N=$((N+1)) 
    echo $N 
done <<<$(ls -l) 

echo "total $N" 
+0

pipe,subshel​​l和解決方法。 gotcha,thx! – sof