Shell 计算循环中的计数失败

Shell 计算循环中的计数失败,shell,Shell,这是我的简化代码ls是find命令的简化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 $filen

这是我的简化代码lsfind命令的简化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" 
n=0
ls*.cpp>/tmp/list
读取文件名时;做
c=`wc-l$filename | awk'{print$1}}`
n=`expr$n+$c`
完成
如何使用第一种形式并得到正确答案? 或者,如何使用第二个表单,但不使用另一个/tmp/list文件


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

我可能会使用以下一个线性函数:

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"
在管道中,因此
$c
$n
的值丢失。如果要保持计数,应先将
while
循环放在第一位:

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

该代码用于解释语法。“我的原始脚本”的用途不是用于计算字数。@DanielYCLin使用
ls
的输出是一种不好的做法,因为这将失败,例如,如果文件名之间有空格(或在
IFS
中使用的任何分隔符)。遍历文件的最佳方法是使用
for
循环,如上例所示。+1。如果我们在打高尔夫球,这是更少的过程:
wc-l<这不是指打高尔夫球,而是
cat*.cpp | wc-l
wc -l *.cpp | tail -1 | awk '{ print $1 }'