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.207mongo --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.207cmd="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.207cmd="rs.initiate();cfg=rs.conf();cfg.members[0].host='$ip_1:27017';rs.reconfig(cfg);"newcmd=$cmdmongo --port 27017 --eval $newcmd
進行一次過濾,才OK。
網上關於mongodb的資料較少,尤其營運和調試。這裡將自己的一點小問題列出來,供大家參考。