在mongo eval命令中使用bash变量来插入数据

时间:2017-12-07 16:05:41

标签: bash mongodb

我不是专家,但我要做的就是运行命令行命令,从中获取数字,将它们放入数组中,然后将它们插入到具有{{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]}"]}})"

但是当我运行它并使用硬编码数组插入数据时,它可以工作,我不明白为什么。

1 个答案:

答案 0 :(得分:1)

不详细介绍如何从speedtest-cli输出中提取感兴趣的数字(speedtest-cli在我的系统上输出可能与您的系统不同;数字包括小数点,而不是{ {1}}),问题在于拆分这些数字 - 即您没有明确地将它们存储到数组中。您应该尝试使用array=(e1 e2 ..) construct:

grep

declare -a

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