为什么在bash中终止循环后变量值会丢失?

为什么在bash中终止循环后变量值会丢失?,bash,Bash,我有一个非常简单的bash脚本来计算文件中每一行出现的数字的总和(我知道有更好的方法可以做到这一点,但我实际上需要这个总和作为一个辅助信息,这个脚本应该在以后做更多的事情)。脚本如下: TOTAL=0; cat $DATAFILE | while read LINE; do COUNT=`echo $LINE| awk '{print $2;}'`; TOTAL=$((TOTAL+COUNT)); done echo "Total = $TOTAL"; total=0

我有一个非常简单的bash脚本来计算文件中每一行出现的数字的总和(我知道有更好的方法可以做到这一点,但我实际上需要这个总和作为一个辅助信息,这个脚本应该在以后做更多的事情)。脚本如下:

TOTAL=0;
cat $DATAFILE | while read LINE; 
do
      COUNT=`echo $LINE| awk '{print $2;}'`;
      TOTAL=$((TOTAL+COUNT));
done
echo "Total = $TOTAL";
total=0
while read -r _ count do; 
  (( total += count ))
done <"$DATAFILE"
但是,我总是得到输出“Total=0”。令人惊讶的是,如果我将最后一行移动到while循环中,就会得到正确的结果。例如,如果输入文件包含

A 5
B 3
C 6
我得到输出

Total = 5
Total = 8
Total = 14
但是当前版本总是输出0。似乎分配给变量TOTAL的值不知怎的丢失了

有人能帮我解决这个问题吗

提前感谢

这是我的名片。幸运的是,您只是因为不必要地使用了
cat
——根本没有理由使用管道


管道完成后,管道的右侧(与管道的其余内容一样,由瞬态子壳组成)将退出,除非您激活了
shopt-s lastpipe

相反,可以添加以下行:

shopt -s lastpipe
或者重新构造循环:

while read LINE; 
do
      COUNT=`echo $LINE| awk '{print $2;}'`;
      TOTAL=$((TOTAL+COUNT));
done <"$DATAFILE"
read
可以在
IFS
本身中拆分字符上的行——您不需要使用
awk

按照惯例,变量名应全部为小写,除非它们表示环境变量或shell内置项。

这是正确的。幸运的是,您只是因为不必要地使用了
cat
——根本没有理由使用管道


管道完成后,管道的右侧(与管道的其余内容一样,由瞬态子壳组成)将退出,除非您激活了
shopt-s lastpipe

相反,可以添加以下行:

shopt -s lastpipe
或者重新构造循环:

while read LINE; 
do
      COUNT=`echo $LINE| awk '{print $2;}'`;
      TOTAL=$((TOTAL+COUNT));
done <"$DATAFILE"
read
可以在
IFS
本身中拆分字符上的行——您不需要使用
awk


按照惯例,变量名应全部小写,除非它们表示环境变量或shell内置项。

因为管道完成时管道的右侧会退出,除非您有
shopt-s lastpipe
活动。因为管道完成时管道的右侧会退出,除非您有
shopt-s lastpipe
这里的重要信息是管道的每个部分都在子shell中执行。这意味着
while
循环在不同的BASH中执行,该BASH终止->所有变量都随之消亡。这里的重要信息是管道的每个部分都在子shell中执行。这意味着
while
循环在不同的BASH中执行,该BASH终止->所有变量随之死亡。