歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

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的資料較少,尤其運維和調試。這裡將自己的一點小問題列出來,供大家參考。

Copyright © Linux教程網 All Rights Reserved