为什么我的Bash计数器在while循环后重置

S42*_*S42 15 bash

我有一个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
Run Code Online (Sandbox Code Playgroud)

上面的输出是单独的行:

Done entry 1
Done entry 2
Finished writing /blah, 0 keys

我想要的输出是:

Done entry 1
Done entry 2
Finished writing /blah, 2 keys

我不太确定为什么nKeys在循环之后是0 :(我认为这是基本但是该死的,如果我能发现它尽管看了http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html和其他资源.

手指越过别人可以看着它然后"好吧!你必须......"!

Pau*_*ce. 5

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

shopt -s lastpipe
Run Code Online (Sandbox Code Playgroud)

另外,正如您可能会在Ignacio提供的链接中看到的那样,您将无用cat.

while read -r line
do
    ...
done < afile
Run Code Online (Sandbox Code Playgroud)