Я использую синтаксис "heredoc", который упоминает Дэвид Янг.Но есть одна загвоздка:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Вышеприведенное НЕ сработает, потому что фраза «$ Существует» будет видна оболочкой и заменена значением переменной среды с именем «Существует».Которого, скорее всего, не существует, поэтому после расширения оболочки оно становится:
#!/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
Я НЕ рекомендую этого, потому что легко забыть сбежать.
Другой вариант - выйти из EOF,как это:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Теперь вы можете поместить все знаки доллара, которые вы хотите, в свой heredoc, и знаки доллара игнорируются.Обратная сторона: это не сработает, если вам нужно поместить параметры / переменные оболочки в ваш скрипт mongo.
Еще один вариант, с которым вы можете поиграть, - связываться с вашим шебангом.Например,
#!/bin/env mongo
<some mongo stuff>
Существует несколько проблем с этим решением:
Это работает только в том случае, если вы пытаетесь сделать сценарий оболочки монго исполняемым из командной строки,Вы не можете смешивать обычные команды оболочки с командами оболочки Монго.И все, что вы сохраняете, это не нужно вводить "mongo" в командной строке ... (достаточно, конечно, причина)
Он работает точно так же, как "mongo""Это означает, что это не позволяет использовать команду" use ".
Я попытался добавить имя базы данных в shebang, что, как вы думаете, будет работать. К сожалению,то, как система обрабатывает строку shebang, все после первого пробела передается в качестве отдельного параметра (как в кавычках) команде env, и env не может найти и запустить ее.
Вместо этого вам нужновстроить изменение базы данных в сам скрипт, например, так:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Как и во всем в жизни, «существует более одного способа сделать это!»