在for循环中给出数组和值

时间:2018-03-26 18:02:35

标签: arrays linux bash for-loop sum

我有这个烦人的问题,甚至我的老师都无法解决:/。 我想用1到100的和值填充一个数组,这是我的代码:

while [ $i -le 100 ]
do
    #filling the list with the sums of i at the pos i
    sumList[$i]=$(echo $i | sum)
    echo $i |sum
    echo $sumList[$i]

    i=$(($i+1))
done

由于某种原因,它只是用第一个值填充所有点(00034 1) 我不知道该怎么做

2 个答案:

答案 0 :(得分:0)

此处ShellCheck

Line 6:
    echo $sumList[$i]
         ^-- SC1087: Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet).
         ^-- SC2128: Expanding an array without an index only gives the first element.

并修复此问题:

i=1
while [ $i -le 100 ]
do
    #filling the list with the sums of i at the pos i
    sumList[$i]=$(echo $i | sum)
    echo $i |sum
    echo ${sumList[$i]}

    i=$(($i+1))
done

您将获得您期望的所有不同校验和和块数:

32802     1
32802 1
00035     1
00035 1
32803     1
32803 1
00036     1
00036 1
32804     1
32804 1
[...]

答案 1 :(得分:0)

如果您实际上是从该脚本检查输出的(删除了echo $i |sum行),那么应该清楚发生了什么:

00034 1[0]
00034 1[1]
00034 1[2]
: : :
00034 1[100]

如您所见,行echo $sumList[$i]给您$sumList(与${sumList[0]}相同)和$i 分别因为根据bash文档(我的重点):

  

可以使用${name[subscript]}引用数组的任何元素。括号是 必需 以避免冲突...

因此,如果将其更改为正确的$ {sumList [$ i]}`,您会看到确实正确设置了数组,只是没有打印出来正确地:

00034 1
32802 1
00035 1
: : :
08244 1

而且,为了达到目标,bash中还有 other 个设施,如果您的目标是,这些设施将使您的代码更简洁:

for i in {0..100}; do sumList[$i]="$(echo $i | sum)" ; done
IFS=$'\n' ; echo "${sumList[*]}"