Shell循环为数组填充1-100求和值时遇重复值问题求助
问题分析与解决
嘿,这问题我熟!你踩了个Shell命令的常见坑——用错sum命令啦!
为什么会得到重复的00034 1?
sum是Unix/Linux系统里用来计算文件(或标准输入)的校验和与字节数的工具,根本不是做数值求和的!比如你执行echo 1 | sum,它输出的是字符串"1\n"(echo默认加换行)的校验和(00034)和字节数(1),而不是1到i的求和结果。再加上你没给i初始化初始值,第一次循环时$i是空值,自然每次输出都是同一个校验和。
修正后的代码方案
下面给你两种正确实现“将1到i的求和值填充到数组sumList第i位”的写法:
方案1:用数学公式直接计算(高效)
利用等差数列求和公式:1+2+...+i = i*(i+1)/2,直接计算每个位置的和:
# 初始化循环变量和数组 i=1 declare -a sumList while [ $i -le 100 ]; do # 用Shell算术表达式计算求和值 sum_val=$(( i * (i + 1) / 2 )) # 填充数组(索引从1到100) sumList[$i]=$sum_val # 打印验证结果 echo "1到$i的和:${sumList[$i]}" # 循环自增 i=$((i + 1)) done
方案2:循环累加(直观易理解)
如果想一步步累加计算,适合学习循环逻辑:
i=1 declare -a sumList current_sum=0 while [ $i -le 100 ]; do # 累加当前i到总和 current_sum=$((current_sum + i)) sumList[$i]=$current_sum echo "1到$i的和:${sumList[$i]}" i=$((i + 1)) done
额外需要注意的点
- 变量初始化:你的原始代码里没给
i赋初始值,第一次循环时$i是空值,会导致判断条件[ $i -le 100 ]报错,必须先设置i=1。 - 数组声明:虽然Shell允许直接使用数组,但显式用
declare -a sumList声明数组会让代码更清晰,避免潜在问题。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

