从文件读取并将内容传递给具有Shellscript的另一个执行程序时,如何转义双引号?

时间:2018-11-13 21:43:50

标签: mongodb shell docker

我在这里遇到了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"
    }
}

另一个可能的原因是有多行。无论哪种方式,我都会坚持下去。

如果有人能给我一个指导,那就太好了。

谢谢!

2 个答案:

答案 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的手册,请参见有关它们如何工作的更多信息。