一个简单的变量测试:
#!/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?
答案 0 :(得分:7)
bash
在自己的子shell中运行管道中的每个语句。 (对于外部命令,例如ls
子shell,只需exec
s命令。)这有效地使所有变量都是本地的。您通常必须使用重定向或命令替换而不是管道来解决此问题。
编辑:这似乎有效:
#!/bin/bash
IFS=
N=0
while read L; do
N=$((N+1))
echo $N
done <<<$(ls -l)
echo "total $N"