我希望在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 .....
我怎样才能做到这一点?
答案 0 :(得分:5)
使用
b=($adse)
你得到一个bash数组b
。可以使用${b[index]}
访问单个参数。指数从零开始,因此第一个元素是${b[0]}
。
请注意,在bash中你会发现很难对这些值做任何事情。使用支持浮点计算的脚本语言(如Perl或Python)可能是个好主意。
有关bash数组的更深入讨论,请参阅this link。
答案 1 :(得分:4)
规范解决方案是:
read -r -d '' -a b <<<"$adse"
与依赖于$adse
的不带引号扩展的默认分词的解决方案不同,内置的read
不会产生不必要的全局字符扩展。
如果要将变量拆分为空白以外的某个字符,可以在本地为IFS
设置read
:
IFS=: read -r -d '' -a b <<<"$adse"
这不会在换行符上分开。如果您想在冒号或换行符上拆分,可以使用IFS=$':\n'
。
以上两者都会将b[0]
设置为第一个元素,而不是b[1]
。如果您想从b[1]
开始,可以将0
或其他内容添加到read
的输入中,然后再添加unset "b[0]"
。
help read
获取选项的解释。简而言之,-r
避免了对反斜杠转义序列的解释; -d ''
导致read
在输入结束而不是行结束时终止,而-a b
会将结果放在数组b
中。
答案 2 :(得分:1)
尝试:
b=($(echo $adse))
但它从索引0开始,如:
echo ${b[0]}
产生:
16.92
答案 3 :(得分:1)
虽然有一个简单的解决方案可以达到你想要的效果,但我相信如果你有一个字符串的分隔符不是空格,那么以下内容也很有用:
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已经说明了将字符串解析为数组所需的全部内容。