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

问题描述 投票:0回答:4

我想编写一个脚本来创建一个具有以下值的数组:

{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

但现在我需要列表更长(但仍具有恒定的间隔)。

有没有办法在单个命令中创建这样的数组?创建此类列表最有效的方法是什么?

arrays bash
4个回答
75
投票

使用

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

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

0
投票

解决此问题的最 bash 方法是使用大括号扩展。此外,使用内置 bash 函数几乎总是更好(出于兼容性和性能原因)

ARRAY_OF_NUMBERS=({0,1}.{0..9} 2.{0..5})
echo "${ARRAY_OF_NUMBERS[@]}"

在这里您可以看到大括号扩展的 2 个用例。没有增量 {0,1},然后在 {0..9} 和 {1..5} 的扩展中增量 1。 由于 bash 不支持内置浮点数,几乎所有内容都必须作为整数或字符串处理。 也就是说,2"."{1..5} 的序列扩展为“2.0 2.1 2.2 2.3 2.4 2.5”。 因为在本例中是“2”和“.”。在进入大括号扩展之前,将被视为普通字符串处理,因为 bash 中数组元素的终止符是空格。

希望我可以帮助任何在我之后偶然发现这个问题的人!

© www.soinside.com 2019 - 2024. All rights reserved.