我不是专家,但我要做的就是运行命令行命令,从中获取数字,将它们放入数组中,然后将它们插入到具有{{1}的mongo数据库中选项。
eval
这就是我正在运行的,每次我遇到错误:
#!/bin/bash
results="$(speedtest-cli --simple | grep -o '[0-9]*')"
echo "${results[@]}"
mongo localhost:27017/ding --eval "db.lloll.insert({date:new Date(),resu:{ping:["${results[0]}","${results[1]}"],down:["${results[2]}","${results[3]}"],uplo:["${results[4]}","${results[5]}"]}})"
但是当我运行它并使用硬编码数组插入数据时,它可以工作,我不明白为什么。
答案 0 :(得分:1)
不详细介绍如何从speedtest-cli
输出中提取感兴趣的数字(speedtest-cli
在我的系统上输出可能与您的系统不同;数字包括小数点,而不是{ {1}}),问题在于拆分这些数字 - 即您没有明确地将它们存储到数组中。您应该尝试使用array=(e1 e2 ..)
construct:
grep
results=( $(speedtest-cli --simple | grep -o '[0-9]*') )
如果您不将结果存储到数组中,则无法使用declare -a results=$(speedtest-cli --simple | grep -o '[0-9]*')
对数字编制索引,就像您尝试的那样。也就是说,您现在使用${results[i]}
运行的是:
--eval
请注意由"db.lloll.insert({date:new Date(),resu:{ping:[46 677 9 18 0 07,],down:[,],uplo:[,]}})"
引起的明显语法错误,其中包含用空格分隔的所有数字,而不是仅包含第一个数字。但是当你使用数组时,你得到的结果如下:
${results[0]
你的
"db.lloll.insert({date:new Date(),resu:{ping:[46,677],down:[9,18],uplo:[0,07]}})"
为您提供了线索 - 每行输出一个数字(由于引用,保留了换行符):
echo "${results[@]}"
如果$ echo "${results[@]}"
46
677
9
18
0
07
实际上是一个数组(如预期的那样),那么这些元素就会加在results
中的第一个字符上,默认情况下这是一个空格:
IFS
检查变量值的更安全(或更强大)方法是使用$ echo "${results[@]}"
46 677 9 18 0 07
:
declare -p