我有一个Bash脚本,我想在其中计算在循环文件时执行了多少操作。该计数似乎在循环中起作用,但在循环之后,变量似乎被重置。

nKeys=0
cat afile | while read -r line
do
  #...do stuff
  let nKeys=nKeys+1
  # this will print 1,2,..., etc as expected
  echo Done entry $nKeys
done
# PROBLEM: this always prints "... 0 keys"
echo Finished writing $destFile, $nKeys keys

以上的输出仅是以下几行:
完成条目1
完成条目2
写完/blah,0键
我想要的输出是:
完成条目1
完成条目2
写完/blah,2个键
我不太清楚为什么nKeys在循环之后是0:(我假设它是一些基本的东西,但是如果我能在查看http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html和其他资源的情况下发现它,那就太糟糕了。
祈祷别人能看着它然后说“好吧!你必须!

最佳答案

在刚刚发布的Bash 4.2中,可以这样做以防止创建子shell:

shopt -s lastpipe

此外,您可能会在Ignacio提供的链接中看到,您有一个Useless Use of cat
while read -r line
do
    ...
done < afile

10-07 22:29