Как избежать двойных кавычек при чтении из файла и передаче содержимого другому исполнителю с помощью шеллскрипта? - PullRequest
0 голосов
/ 14 ноября 2018

У меня проблема с шеллскриптом.

Мне нужно прочитать файл 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 $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 голосов
/ 14 ноября 2018

Если у вас есть столько данных, которые вы пытаетесь избежать, и, тем более, что похоже, что вы пытаетесь написать весь сценарий, вам будет гораздо лучше записать его в файл и передатьимя файла в качестве параметра для mongo.

Одна хитрость в том, что вам нужно каким-то образом ввести переменную $MY_COLLECTION.Похоже, вы можете оба --eval фрагмента и загрузить скрипт , который в вашем случае может выглядеть как

mongo ... --eval "my_collection = '$MY_COLLECTION'" createCollection.js

Еще один трюк, который выглядит так, как он будет работать, это поместите ваш скрипт в оболочку heredoc и передайте его в mongo на stdin, вместо того, чтобы пытаться вставить его в --eval.

В вашем скрипте также, вероятно, лучше загрузить определение валидатора как объекта JSON, вместо того, чтобы пытаться использовать интерполяцию оболочки для его внедрения.

0 голосов
/ 14 ноября 2018

Чтобы убрать все двойные кавычки и обрезать пробелы в файле json, вы можете сделать что-то вроде этого.

VALIDATOR=$(
     # replace " with \"
     sed 's/\"/\\\"/g' /tmp/schema-validator.json |
         # delete newlines
         tr -d '\n' |
         # squeeze spaces (delete all but one space)
         tr -s ' ')

См. Справочные страницы для sed и tr для получения дополнительной информации о том, как они работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...