我想在shell腳本中執行mongo
命令,例如在腳本test.sh
: javascript
#!/bin/sh mongo myDbName db.mycollection.findOne() show collections
當我經過./test.sh
執行此腳本時,將創建與MongoDB的鏈接,但不會執行如下命令。 java
如何經過shell腳本test.sh
執行其餘命令? shell
也有關於此的官方文檔頁面。 數據庫
該頁面上的示例包括: json
mongo server:27017/dbname --quiet my_commands.js mongo test --eval "printjson(db.getCollectionNames())"
我使用David Young提到的「 heredoc」語法。 可是有一個問題: ui
#!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF
上面的命令不起做用,由於外殼程序會看到短語「 $ exists」,並用名爲「 exists」的環境變量的值代替。 可能不存在,所以在shell擴展後,它變爲: spa
#!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { : true } }) .forEach( printjson ); EOF
爲了使它經過,您有兩個選擇。 一個很醜,一個很不錯。 一,醜陋的一面:逃脫$符號: 命令行
#!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { \$exists: true } }) .forEach( printjson ); EOF
我不建議這樣作,由於很容易忘記逃脫。 code
另外一個選擇是逃避EOF,以下所示: server
#!/usr/bin/sh mongo <db> <<\EOF db.<collection>.find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF
如今,您能夠將全部所需的美圓符號放入heredoc中,而美圓符號將被忽略。 不利的一面:若是您須要在mongo腳本中放入shell參數/變量,那將不起做用。
您可使用的另外一種選擇是弄亂您的shebang。 例如,
#!/bin/env mongo <some mongo stuff>
此解決方案存在幾個問題:
僅當您嘗試從命令行使mongo shell腳本可執行時,它纔有效。 您不能將常規的shell命令與mongo shell命令混合使用。 這樣,您節省的全部事情都沒必要在命令行上鍵入「 mongo」 ...(固然,理由足夠多)
它的功能與「 mongo <some-js-file>」徹底相同,這意味着它不容許您使用「 use <db>」命令。
我嘗試過將數據庫名稱添加到shebang中,您認爲這會起做用。 不幸的是,系統處理shebang行的方式是,第一個空格以後的全部內容都做爲單個參數(如被引用)傳遞給env命令,而env找不到並運行它。
相反,您必須將數據庫更改嵌入腳本自己中,以下所示:
#!/bin/env mongo db = db.getSiblingDB('<db>'); <your script>
就像生活中的一切同樣,「有不止一種方法能夠作到這一點!」
這個怎麼樣:
echo "db.mycollection.findOne()" | mongo myDbName echo "show collections" | mongo myDbName
--shell標誌也可用於javascript文件
mongo --shell /path/to/jsfile/test.js
謝謝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
將它們強制在多行上。