在bash中创建一个数字序列数组

48
我想编写一个脚本,创建一个包含以下值的数组:
{0.1 0.2 0.3 ... 2.5}

到目前为止,我一直在使用以下脚本:

plist=(0.1 0.2 0.3 0.4)
for i in ${plist[@]}; do
    echo "submit a simulation with this parameter:"
    echo "$i"
done

现在我需要这个列表变得更长(但间隔仍然是恒定的)。

有没有一种方法可以用单个命令创建这样的数组?最高效的方法是什么来创建这样一个列表?


1
如果间隔是恒定的,为什么不创建一个函数来通过计算返回索引对应的值呢? - Jean-François Fabre
2
如果时间间隔是固定的,请使用 seq 命令。 - Jdamian
3个回答

72

使用seq命令,你可以输入seq FIRST STEP LAST。在你的情况下:

seq 0 0.1 2.5

那么现在的问题就是将这些数值存储在一个数组中:

vals=($(seq 0 0.1 2.5))

您可以使用以下方式检查值:

$ printf "%s\n" "${vals[@]}"
0,0
0,1
0,2
...
2,3
2,4
2,5

是的,我的区域设置将小数点改为逗号。这可以通过设置LC_NUMERIC="en_US.UTF-8"进行更改。

顺便说一下,花括号扩展也允许设置增量。问题在于它必须是整数:

$ echo {0..15..3}
0 3 6 9 12 15

10

Bash支持C风格的for循环:

$ for ((i=1;i<5;i+=1)); do echo "0.${i}" ; done
0.1
0.2
0.3
0.4

这不会创建一个数组,因此与问题无关。 - Chris
array=($(for ((i=1;i<5;i+=1)); do echo "0.${i}"; done)) - robrecord

1

补充主要答案

在我的情况下,seq 不是最好的选择。
要生成一个序列,您还可以使用 jot 实用程序。但是,此命令具有更复杂的语法。

# 1 2 3 4
jot - 1 4

# 3 evenly distributed numbers between 0 and 10
# 0 5 10
jot 3 0 10

# a b c ... z
jot -c - 97 122

你能详细说明在某些情况下为什么jotseq更好吗? - Neinstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接