我想在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
将它们强制在多行上。