我在目录上运行查找以对文件执行某些操作。我还想计算有多少文件受到影响,但循环中发生了一些奇怪的事情:
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
会自行重置?
答案 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