bash脚本中的变量重置

时间:2011-11-10 21:13:52

标签: bash

一个简单的变量测试:

#!/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 个答案:

答案 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"