Bash-将字符串解析成浮点数数组

Bash-parsing string into an array of floating point numbers

我希望在 BASH 中创建一个浮点数数组(称为 b),数组的内容通过解析以下变量给出 adse:

echo $adse
16.92 18.29 19.18 20.87 2.78 2.88 2.77 2.83 2.80 2.78 2.73 2.73 2.75 2.93 2.91 2.93 2.77 4.64 2.67 3.01 6.78

使得b[1]=16.92; b[2]=18.29.......

我怎样才能做到这一点?

试试:

b=($(echo $adse))

但它以索引 0 开头,例如:

echo ${b[0]}

产生:

16.92

b=($adse)

你得到一个 bash 数组 b。可以使用 ${b[index]} 访问单个参数。索引是从零开始的,所以第一个元素是 ${b[0]}.

请注意,您会发现很难对 bash 中的这些值执行任何操作。使用支持浮点计算的脚本语言可能是个好主意,例如 Perl 或 Python.

有关 bash 数组的更深入讨论,请参阅 this link

虽然有一个简单的解决方案可以实现您想要的效果,但我相信如果您有一个分隔符不是空格的字符串,以下内容也很有用:

b=()
adse="16.92 18.29 19.18 20.87 2.78 2.88 2.77 2.83 2.80 2.78 2.73 2.73 2.75 2.93 2.91 2.93 2.77 4.64 2.67 3.01 6.78"

b=(${adse// / })

例如,如果您有这样的字符串:

adse="16.92:18.29...etc"

您必须将 b=(${adse// / }) 更改为:

b=(${adse//:/ })

但是,对于您的特定情况,将字符串解析为数组所需的一切都已在下面的 Birei 中说明。

规范解是:

read -r -d '' -a b <<<"$adse"

与依赖 $adse 的未加引号扩展的默认分词的解决方案不同,read 内置不会产生不需要的 glob 字符扩展。

如果你想在除空格之外的某个字符上拆分变量,你可以在本地为 read:

设置 IFS
IFS=: read -r -d '' -a b <<<"$adse"

这不会在换行符上拆分。如果你想在冒号或换行符上拆分,你可以使用 IFS=$':\n'.

以上两个都会将 b[0] 设置为第一个元素,而不是 b[1]。如果您想从 b[1] 开始,您可以在 read 的输入前添加 0 或类似的内容,然后再添加 unset "b[0]"

help read 以获得选项的解释。简而言之,-r 避免了对反斜杠转义序列的解释; -d '' 导致 read 在输入的末尾而不是一行的末尾终止,并且 -a b 导致结果被放置在数组 b.