2011-11-10 46 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