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?
简单变量测试:变量复位
#!/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?
bash
在其自己的子shell中的管道中运行每个语句。 (对于外部命令,例如ls
,subshell只是exec
的命令。)这有效地使所有变量都是本地的。您通常必须通过使用重定向或命令替换而不是管道来解决此问题。
编辑:这似乎工作:
#!/bin/bash
IFS=
N=0
while read L; do
N=$((N+1))
echo $N
done <<<$(ls -l)
echo "total $N"
pipe,subshell和解决方法。 gotcha,thx! – sof
解决为已知的子shell的问题。 check out http://stackoverflow.com/questions/5006229/why-does-my-bash-counter-reset-after-while-loop – sof
你可以用((N ++))替换$((N + 1)))具有相同的结果 – ata