我想在shell腳本中執行mongo指令,例如在腳本test.sh :
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
當我通過./test.sh執行此腳本時,将建立與MongoDB的連接配接,但不會執行以下指令。
如何通過shell腳本test.sh執行其他指令?
#1樓
也有關于此的官方文檔頁面。
該頁面上的示例包括:
mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
#2樓
我使用David Young提到的“ heredoc”文法。 但是有一個問題:
#!/usr/bin/sh
mongo <
db..find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
上面的指令不起作用,因為外殼程式會看到短語“ $ exists”,并用名為“ exists”的環境變量的值代替。 可能不存在,是以在shell擴充後,它變為:
#!/usr/bin/sh
mongo <
db..find({
fieldName: { : true }
})
.forEach( printjson );
EOF
為了使它通過,您有兩個選擇。 一個很醜,一個很不錯。 一,醜陋的一面:逃脫$符号:
#!/usr/bin/sh
mongo <
db..find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
我不建議這樣做,因為很容易忘記逃脫。
另一個選擇是逃避EOF,如下所示:
#!/usr/bin/sh
mongo <
db..find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
現在,您可以将所有所需的美元符号放入heredoc中,而美元符号将被忽略。 不利的一面:如果您需要在mongo腳本中放入shell參數/變量,那将不起作用。
您可以使用的另一種選擇是弄亂您的shebang。 例如,
#!/bin/env mongo
此解決方案存在幾個問題:
僅當您嘗試從指令行使mongo shell腳本可執行時,它才有效。 您不能将正常的shell指令與mongo shell指令混合使用。 這樣,您節省的所有事情都不必在指令行上鍵入“ mongo” ...(當然,理由足夠多)
它的功能與“ mongo ”完全相同,這意味着它不允許您使用“ use ”指令。
我嘗試過将資料庫名稱添加到shebang中,您認為這會起作用。 不幸的是,系統處理shebang行的方式是,第一個空格之後的所有内容都作為單個參數(如被引用)傳遞給env指令,而env找不到并運作它。
相反,您必須将資料庫更改嵌入腳本本身中,如下所示:
#!/bin/env mongo
db = db.getSiblingDB('');
就像生活中的一切一樣,“有不止一種方法可以做到這一點!”
#3樓
這個怎麼樣:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
#4樓
--shell标志也可用于javascript檔案
mongo --shell /path/to/jsfile/test.js
#5樓
謝謝printf ! 在Linux環境中,這是一種隻運作一個檔案的更好方法。 假設您有兩個帶有多個指令的檔案mongoCmds.js :
use someDb
db.someColl.find()
然後是驅動程式外殼檔案runMongoCmds.sh
mongo < mongoCmds.js
相反,隻有一個檔案,其中包含runMongoCmds.sh
printf "use someDb\ndb.someColl.find()" | mongo
Bash的printf比echo更為健壯,并且允許在指令之間使用\\n将它們強制在多行上。