有没有办法在脚本中使用数组指定一定范围的数字?

DSH*_*H72 6 command-line bash scripts

我正在尝试使用脚本中的数组添加我随机生成的前 20 个数字。这可能吗?

我使用我之前的脚本生成了 100 个数字,并希望我也可以在这种情况下使用它。现在我需要使用数组添加前 20 个。我可以在我的脚本中加入一个函数来解决这个问题吗?

主脚本

MAXCOUNT=100
count=1

while [ "$count" -le $MAXCOUNT ]; do
number[$count]=$RANDOM
let "count += 1"
done

echo "${number[@]}
Run Code Online (Sandbox Code Playgroud)

ter*_*don 12

我想您是在问如何获取 bash 数组的前 N ​​个元素。如果是这样,这应该有效:

$ array=( $(seq 1 30 ) )
$ echo ${array[@]}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
$ echo ${array[@]:0:20}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
Run Code Online (Sandbox Code Playgroud)

一般格式为${array[@]:START:LENGTH}. 这将返回从 START 开始的数组的 LENGTH 下一个元素。

因此,要添加前 20 个,您可以这样做(请注意,我从 0 开始,而不是从 1 开始,因为数组从 0 开始。我建议您更正脚本并将其设置count=0在开头而不是count=1; 如果您不想, 将0以下内容更改为1):

for i in ${number[@]:0:20}; do
    sum=$((sum + i))
done
echo $sum
Run Code Online (Sandbox Code Playgroud)

或者,您可以只迭代数组的前 20 个元素:

for((i=0;i<20;i++))
do
    sum=$(( sum + number[$i] ))
done
echo "$sum"
Run Code Online (Sandbox Code Playgroud)

这两种方法都假定您正在添加整数。Bash 不处理浮点数,因此如果您尝试添加分数,它们会中断。如果这是一个问题,请使用@hemayl 的巧妙技巧或任何其他可以进行数学运算的程序。例如:

echo "${number[@]:0:20}" | perl -lane '$k+=$_ for @F; print $k'
Run Code Online (Sandbox Code Playgroud)

  • @heemayl 看起来是这样,是的。显然,bash 将跳过任何未定义的索引。我没有找到任何提到它的文档,但我确实确认[此处](https://www.gnu.org/software/bash/manual/html_node/Arrays.html)`array[N]=bar`需要“N”是算术运算,而“declare -A”对于关联数组是必需的。因此,看起来未定义的索引只是被跳过了。 (2认同)

hee*_*ayl 5

添加数组的前 20 个数字number

echo "${number[@]:0:20}" | tr ' ' '+' | bc
Run Code Online (Sandbox Code Playgroud)

或者

tr ' ' '+' <<<"${number[@]:0:20}" | bc
Run Code Online (Sandbox Code Playgroud)
  • "${number[@]:1:20}"获取数组的前 20 个元素

  • tr ' ' '+'将所有空格转换为+以便我们可以将其用作输入bc来完成加法