【问题标题】:Bash sum while loop not always giving the same outputBash sum while 循环并不总是给出相同的输出
【发布时间】:2018-07-20 15:30:27
【问题描述】:

我有一个 txt 文件,每行都有整数,我想要总和。

SUM=0                             

while read line || [ -n "$line" ] ; do
    let "SUM += line"             

done                                  
echo $SUM                         

问题是,虽然大多数时候我得到正确的结果,但有时我得到 SUM+1。

如何解释?

输入文件:

2 
38
21
50
42
59
19
19
29
17
24
13
45
49
48
13
20
20
51
41
51
45
1 
17
6 
46
52
50
32
19
8 
28
35
33
13
4 
2 
49
32
19
17
17
16
51
23
32
26
54
31
54
14
17
55
53
18
34
4 
16
15

预期总和:1709,有时我得到 1710。

【问题讨论】:

  • 更好用:awk '{sum+=$1} END{print sum}' file
  • 关于更好的方法来做你正在做的事情,看看this question。不过,您的问题不是重复的,因为您不是在问如何做,而是为什么您会看到您描述的+1
  • 日志记录对找出问题有很大帮助。如果您运行bash -x yourscript 以在执行时打印每一行,并将来自工作实例的日志与损坏的实例进行比较,您就会得到答案。 (顺便说一句,let 已过时;(( SUM += line )) 是现代替代方案)。将: SUM="$sum" line="$line" 放入循环中以使您的set -x 日志包含当前值。
  • 请参阅ideone.com/mQv4zg 了解在线解释器运行您的代码 1000 次,并在所有这些上得到相同的答案。如果您可以在那里分叉代码,从而返回不一致的结果,那么我们就会遇到可以重现的问题,从而开始回答。
  • @BragiPls 你必须准确地展示你是如何运行脚本来重现你的问题的。

标签: bash while-loop sum


【解决方案1】:

所以解释是在我的本地测试中,我使用的是 SECONDS 而不是 SUM。我认为让这个问题更笼统是个好主意。提示:永远不要像我刚才那样做,因为更有经验的程序员会立即发现异常。 来自 bash 手册:

秒 每次引用此参数时,都会返回自 shell 调用以来的秒数。如果为 SECONDS 分配了一个值,则后续引用时返回的值是自分配以来的秒数加上分配的值。如果 SECONDS 未设置,即使随后被重置,它也会失去其特殊属性。

Benjamin W.:“不要使用大写变量名”从未如此重要! ;)

【讨论】:

  • 感谢大家的帮助,对不起菜鸟呵呵
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多