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


我们用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的资料较少,尤其运维和调试。这里将自己的一点小问题列出来,供大家参考。

相关内容