为什么循环内赋值不影响全局值?

Why assignment inside loop not influence the global value?

我有下一个 data sourcecode:

数据:

1
2
3

test.sh:

s=0
cat data | while read oneline
do
    v=$(($oneline))
    s=$(($s+$v))
    echo $s
done
echo "Final: $s"

执行:

$ ./test.sh
1
3
6
Final: 0

我想做的是对数据文件中的所有值求和,你可以看到 echo 内部循环成功地逐步打印总和,但在循环外部,我们得到 Final: 0 ,应该是 Final: 6。我犯了什么错误?

管道创建子shell。 while read 运行 在与您的脚本不同的 shell 上。以下将修复它

s=0
while read oneline
do
    v=$(($oneline))
    s=$(($s+$v))
    echo $s
done < data
echo "Final: $s"