这是我的简化代码。 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之间传递变量
答案 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"