我有一组文件,每个文件都包含一个(整数)数字,即同一名称目录中的文件数(不带.txt后缀)-这是每个目录上wc
的结果。
我想把文件里的数字加起来。我试过:
i=0;
find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do i=$i+`cat $j.txt`; done
echo $i
但答案是0。如果我只是
echo
的输出:i=0; find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read j; do echo `cat $j.txt`; done
价值观如下:
1313
1528
13465
22258
7262
6162
...
想必我必须以某种方式投射
cat
的输出?[编辑]
我最终找到了自己的解决方案:
i=0;
for j in `find -mindepth 1 -maxdepth 1 -type d -printf '%f\n'`; do
expr $((i+=$(cat $j.txt)));
done;
28000
30250
...
...
647185
649607
但公认的答案更简洁,因为它不会一路输出
最佳答案
对cat
的输出求和的方法应该有效。但是,您得到的是0
,因为您的while
循环在一个子shell中运行,因此一旦循环结束,存储总和的变量就会超出范围。有关详细信息,请参见BashFAQ/024。
以下是一种解决方法,使用process substitution(而不是管道):
SUM=0
while read V; do
let SUM="SUM+V"
done < <(find -mindepth 1 -maxdepth 1 -type d -exec cat "{}.txt" \;)
注意,我冒昧地更改了find/cat/sum操作,但是您的方法也应该可以正常工作。
关于linux - 将cat输出到bash数字变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8166522/