Shell脚本调用mongo命令传递参数时注意引号和变量

页面导航:首页 > 操作系统 > LINUX > Shell脚本调用mongo命令传递参数时注意引号和变量

Shell脚本调用mongo命令传递参数时注意引号和变量

来源: 作者: 时间:2016-01-13 16:43 【

我们用shell脚本来完成mongodb shard集群搭建的自动化过程,就涉及到登录到mongodb shell中完成一系列mongo命令。类似下面: ! bin bash mongo --port 27017 --eval "rs initiate();cfg=rs conf(

我们用shell脚本来完成mongodb shard集群搭建的自动化过程,就涉及到登录到mongodb shell中完成一系列mongo命令。类似下面:

#!/bin/bash

...

mongo --port 27017 --eval "rs.initiate();cfg=rs.conf();cfg.members[0].host='172.17.0.207:27017';rs.reconfig(cfg);" 

要注意 –eval 后接的参数中的单引号不能换成反斜杠加双引号,即不能是下面这样:

#!/bin/bash

...

mongo --port 27017 --eval "rs.initiate();cfg=rs.conf();cfg.members[0].host=\"172.17.0.207:27017\";rs.reconfig(cfg);" 

我们会用变量ip_1来代替其中的172.17.0.207,那想当然就变成下面这样:

#!/bin/bash

...

ip_1=172.17.0.207

mongo --port 27017 --eval "rs.initiate();cfg=rs.conf();cfg.members[0].host='$ip_1:27017';rs.reconfig(cfg);" 

这样是行不通的。 –eval的参数中不能直接出现变量。于是换成下面:

#!/bin/bash

...

ip_1=172.17.0.207
cmd="rs.initiate();cfg=rs.conf();cfg.members[0].host='$ip_1:27017';rs.reconfig(cfg);"
mongo --port 27017 --eval $cmd 

还是不行,虽然感觉eval的参数已经变成cmd这个纯字符串了,但实际上并没有替换变量ip_1,所以我们需要这样:

#!/bin/bash

...

ip_1=172.17.0.207
cmd="rs.initiate();cfg=rs.conf();cfg.members[0].host='$ip_1:27017';rs.reconfig(cfg);"
newcmd=$cmd
mongo --port 27017 --eval $newcmd 

进行一次过滤,才OK。

网上关于mongodb的资料较少,尤其运维和调试。这里将自己的一点小问题列出来,供大家参考。

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<