我使用了David Young提到的“heredoc”语法 . 但是有一个问题:
#!/usr/bin/sh
mongo <
db..find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
以上操作不起作用,因为shell将看到短语“$ 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('');
与生活中的任何事物一样,“有不止一种方法可以做到!”