为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

斯蒂芬大帝 2020-02-01 16:55:54
我有一个Bash脚本,我想在其中计算在循环文件时完成了多少操作。计数似乎在循环内起作用,但在此之后,变量似乎已重置。nKeys=0cat afile | while read -r linedo  #...do stuff  let nKeys=nKeys+1  # this will print 1,2,..., etc as expected  echo Done entry $nKeysdone# 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,但还是能认出它,但该死的和其他资源。手指交叉着别人可以看着它,然后走开,“嗯!你必须……”!
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

在刚刚发布的Bash 4.2中,您可以执行以下操作以防止创建子外壳:


shopt -s lastpipe

另外,您可能会在Ignacio提供的链接中看到,您对的无用cat。


while read -r line

do

    ...

done < afile


查看完整回答
反对 回复 2020-02-01
?
慕的地10843

TA贡献1785条经验 获得超8个赞

如已接受的答案中所述,这是因为管道产生了单独的子流程。为避免这种情况,command grouping一直是我的最佳选择。也就是说,在子外壳中的管道之后进行所有操作。


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

}

现在它将报告$nKeys“正确” 的值(即您希望的值)。


查看完整回答
反对 回复 2020-02-01
  • 3 回答
  • 0 关注
  • 723 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信