计算循环中的计数失败

时间:2012-03-07 08:50:03

标签: shell

这是我的简化代码。 ls 简化为查找命令。另一个命令简化了 wc

n=0
ls *.cpp | while read filename ; do
  c=`wc -l $filename | awk '{print $1}'}`
  n=`expr $n + $c`
done
echo "$n"  #always be 0

在之前的代码中失败,以下成功

n=0
ls *.cpp > /tmp/list
while read filename ; do
  c=`wc -l $filename | awk '{print $1}'}`
  n=`expr $n + $c`
done < /tmp/list
echo "$n" 

如何使用第一张表格并获得正确答案? 或者,如何使用第二种形式但没有其他/ tmp / list文件?

也许我的问题是如何在自动生成的子shell之间传递变量

2 个答案:

答案 0 :(得分:2)

在管道every process except the first one is in a subshell中,$c$n的值丢失。如果你想保持计数,你应该先放while循环:

while read ...; do
    c=...
    n=...
done < <(find . -maxdepth 1 -name '*.cpp')
echo "$n"

但还有更好的方法:

wc -l *.cpp | tail -1 | awk '{ print $1 }'

答案 1 :(得分:0)

我可能会使用以下单行:

wc -l *.cpp | tail -n1 | awk '{print $1}'

但是,如果您希望修复原始脚本,可以使用for循环而不是while循环,如下所示:

#!/bin/bash
n=0
for filename in *.cpp; do
  c=`wc -l $filename | awk '{print $1}'`
  n=`expr $n + $c`
done
echo "$n"