计数一个while循环

时间:2015-01-22 13:48:52

标签: linux bash

我在目录上运行查找以对文件执行某些操作。我还想计算有多少文件受到影响,但循环中发生了一些奇怪的事情:

COUNTER=0

find . -type f -name "*.txt" | while read f
do 
  let COUNTER++
  echo Counter is $COUNTER # This shows COUNTER working...
done

echo Counter is $COUNTER # COUNTER is back to 0 at this point...

为什么$COUNTER会自行重置?

3 个答案:

答案 0 :(得分:2)

更改为:

COUNTER=0

while read -r entry
do 
  let COUNTER++
  echo Counter is $COUNTER # This shows COUNTER working...
done < <(find . -type f -name "*.txt")

答案 1 :(得分:2)

在循环内部创建一个新的SubShell,它具有与外部世界不同的上下文。已经提到的page总结了这一点。 @ arco444的另一个答案显示了此页面中的进程替换解决方法。

与评论相关的页面引用:

  

BourneShell在输入或输出任何东西(循环,大小写等)时创建子shell,但是通过使用管道或重定向运算符('&lt;','&gt;')重定向简单命令。

所以问题不是循环,而是使用管道(|)运算符。

答案 2 :(得分:-1)

这也有效:

COUNTER=0

for line in $(find . -type f -name "*.txt");
do
  let COUNTER++
  echo Counter is $COUNTER
done