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
.
我希望在 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
.