我在这里遇到了shellscript问题。
我需要读取一个json文件,并使用另一个命令将其作为字符串传递。 基本上,我正在做的是读取具有模式验证器的json文件,并在创建新集合时将这个模式验证器传递给Mongo。
如果我从.sh文件中传递了以下命令:
mongo $DATABASE -u $MY_USER -p $PASS --eval "db.createCollection('$MY_COLLECTION', { validator: { \$jsonSchema: { \"bsonType\":\"object\", \"additionalProperties\":false, \"required\":[ \"mongo-modified\", \"mongo-revision\" ], \"properties\":{ \"_id\":{}, \"Description\":{\"bsonType\":\"string\"},\"mongo-modified\":{\"bsonType\":\"date\"},\"mongo-revision\":{\"bsonType\":\"string\"},\"Summary\":{\"bsonType\":\"string\"}}} } });"
然后正常工作。 如您所见,我必须转义所有双引号以使其起作用。 问题是,我要从那里读取一个json文件,而不是对其进行硬编码:
VALIDATOR=`cat /tmp/schema-validator.json`
然后我会这样称呼mongo:
mongo $DATABASE -u $MY_USER -p $PASS --eval "db.createCollection('$MY_COLLECTION', { validator: { $VALIDATOR } });"
这种方式无法正常工作,我相信原因是我在$ VALIDATOR内的报价。
Json文件如下所示:
{
"bsonType": "object",
"additionalProperties": false,
"required": [
"mongo-modified",
"mongo-revision"
],
"properties": {
"_id": {
},
"Description": {
"bsonType": "string"
},
"mongo-modified": {
"bsonType": "date"
},
"mongo-revision": {
"bsonType": "string"
},
"Summary": {
"bsonType": "string"
}
}
另一个可能的原因是有多行。无论哪种方式,我都会坚持下去。
如果有人能给我一个指导,那就太好了。
谢谢!
答案 0 :(得分:1)
如果您要逃逸的数据量很大,尤其是由于它看起来像您试图编写整个脚本,那么最好将其写入文件并passing the filename as a parameter to mongo
一个窍门是您需要以某种方式注入$MY_COLLECTION
变量。看来您可以both --eval
a fragment and load a script,在您的情况下,它看起来像
mongo ... --eval "my_collection = '$MY_COLLECTION'" createCollection.js
另一个可行的技巧是在标准输入上put your script in a shell heredoc并将其传递给mongo
,而不是尝试将其塞入--eval
。
在脚本中,最好将验证器定义load作为JSON对象,而不是尝试使用shell插值法将其注入。
答案 1 :(得分:0)
要转义所有双引号并修剪json文件中的空格,可以执行以下操作。
python manage.py process_tasks
有关sed和tr的手册,请参见有关它们如何工作的更多信息。